相信很多朋友在跟随微软.net core 从windows平台迁移至linux平台的过程中遇到很多别扭的地方,这里我只聊聊 运行时 调试的那些事儿。
首先从工具上来讲Windows上的windbg肯定是运行时的首选调试工具(因为有对应版本的SOS.dll),在linux平台运行时调试需要切换到lldb (Only lldb is supported by the SOS plugin. gdb can be used to debug the coreclr code but with no SOS support.)
调试器的原理和功能基本一样,但细节到某个功能的命令自然会有区别,尤其是熟练了其中1个的命令之后(比如之前在看汇编的时候是Intel格式,现在要适用AT&T格式)…
这里先总结一些个人常用的命令在 windbg下和lldb下的对比:
非托管命令:
非托管命令 | lldb | windbg |
---|---|---|
列出当前模块 | image list | lmf |
当前线程 | thread list | ~ |
当前线程栈回溯 | thread backtrace | kp |
所有线程栈回溯 | thread backtrace all | ~* kp |
切换线程 | thread select 2 | ~2s kp |
查看寄存器 | re r | r |
查看内存(8字节) | memory read –size 8 –format x <address> | dq <address> |
LLDB同GDB的命令对比:https://lldb.llvm.org/lldb-gdb.html
托管命令:
这里先介绍下自己写的开源lldb调试.net Core扩展模块 Yinuo
在使用lldb调试linux .net Core程序的过程中,有很多不适应的地方,比如遍历并查看所有线程的托管栈回溯 在windbg下可以~*e !clrstack
在lldb里虽然有bt all
和clrstack
但是却只能手动切换单个线程再回溯,没有办法结合到一起,还有一个原因是lldb内命令输出的内容颜色统一,不太好区分重点关注的点,比如线程回溯比较关注方法名,托管对象转储比较关注内部对象地址等等,lldb的好处是支持python或者c++