作者:张富春(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)
- 输出 byte[] 中的字符串内容:
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这个不是调试工具。

浙公网安备 33010602011771号