作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


总结:想不花钱就变强是不可能的,调试 C# 很困难的核心原因可能是你没有花钱买 Visual Studio.

下面是 在 linux 下调试 C# 程序的步骤。

1. 安装

  • 如果没有安装 dotnet, 就先安装 dotnet
curl -fsSL https://dot.net/v1/dotnet-install.sh -o dotnet-install.sh
chmod +x dotnet-install.sh
./dotnet-install.sh --channel 10.0
# 加到环境变量
echo "export DOTNET_ROOT=$HOME/.dotnet" >> ~/.bashrc
echo "export PATH=$DOTNET_ROOT:$PATH" >> ~/.bashrc
source ~/.bashrc
# 验证
dotnet --version
  • 安装调试器
wget https://github.com/Samsung/netcoredbg/releases/download/3.1.3-1062/netcoredbg-linux-amd64.tar.gz
sudo tar -zxvf netcoredbg-linux-amd64.tar.gz -C /usr/local/bin
echo "export PATH=/usr/local/bin/netcoredbg/:$PATH" >> ~/.bashrc
source ~/.bashrc
# 验证
netcoredbg --version

2. 编译代码

  • 把源码编译到二进制中

在 .csproj 文件中加入:

  <PropertyGroup>
    <DebugType>portable</DebugType>
    <DebugSymbols>true</DebugSymbols>
    <EmbedAllSources>true</EmbedAllSources>
    <EmbedUntrackedSources>true</EmbedUntrackedSources>
    <Optimize>false</Optimize>
  </PropertyGroup>
  • 编译
dotnet build -c Debug $(PROJECT).csproj -o ../../build/code-snippets/$(PROJECT)/

编译 debug 版本。

3. 运行调试器

netcoredbg \
        --interpreter=cli -- \
        dotnet ../../build/code-snippets/ConsoleLoggerCli/ConsoleLoggerCli.dll -threadpool.max=1

注意:

  • 一定要以 dotnet 来运行
  • 要运行的二进制程序是 .dll 文件
  • 后面可以跟命令行参数。 (-threadpool.max=1 是我自己程序的命令行参数)
  • 输入 help 可以查看命令

设置断点

break Program.cs:10  # break 可以简写为 b

这里指定 Main() 函数中的一行为断点。

执行

run   # 或者简写为 r

开始运行到断点。

单步

  • list 或 l: 浏览源码
  • step 或 s: 执行到函数内部
  • next 或 n: 执行到下一行

这个工具很难用,执行 n 后,需要手动再执行 l 来显示源码。

  • print 或 p: 输出某个变量的值:
    • 输出 byte[] 中的字符串内容: p System.Text.Encoding.UTF8.GetString(myBytes)

4. 避坑

以下方法我尝试过不行:

  • macos + arm64: netcoredbg 没有 arm64 版本。想要在 macos 上调试估计就只能用 docker 或者改 linux 平台了。
  • vsdbg
    • 下载: curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l ~/.vsdbg
    • 使用: ~/.vsdbg/vsdbg --interpreter=mi -- dotnet ../../build/code-snippets/$(PRJ)/$(PRJ) -- -threadpool.max=1, 根本就无法运行
  • dotnet-sos
    • 下载: dotnet tool install -g dotnet-sos
    • 安装: dotnet-sos install
    • lldb 下调试: lldb -- ../../build/code-snippets/$(PRJ)/$(PRJ) -threadpool.max=1, lldb 中执行到 setsymbolserver -ms 时崩溃。macos 下无法使用。
  • dotnet tool install --global dotnet-dump 这个不是调试工具。