使用 GDB 和 LLDB 在 D 代码中遇到代码行断点的问题
Problems with hitting Line Of Code breakpoints in D code with GDB and LLDB
我已经确保使用 -g
标志(添加符号调试信息)构建我的 D 程序,看起来我可以像这样在 GDB 和 LLDB 中设置简单的 LOC 断点:b SomeModule.d:42
- 调试器回复新断点的内存地址。
然而,当我 run
来自调试器的程序时,它在与 SomeModule.d:42
完全不同的地方停止了。我错过了什么?
D 默认是安全的,默认是垃圾回收的语言。
所以除了你自己的断点,程序经常会被垃圾收集器信号(SIGUSR1,SIGUSR2)打断。
在 GDB 中,这可以通过以下方式防止:
(gdb) handle SIGUSR1 nostop noprint
Signal Stop Print Pass to program Description
SIGUSR1 No No Yes User defined signal 1
(gdb) handle SIGUSR2 nostop noprint
Signal Stop Print Pass to program Description
SIGUSR2 No No Yes User defined signal 2
更好的是,通过将上述 2 个命令放在一个文件中并使用 -x gdb_command_file
.
启动 GDB 来实现自动化
对应的LLDB-ese发音不同:
(lldb) process handle --stop false --notify false SIGUSR1 SIGUSR2
我是 not sure it's possible to automate it similarly with LLDB alone。
我已经确保使用 -g
标志(添加符号调试信息)构建我的 D 程序,看起来我可以像这样在 GDB 和 LLDB 中设置简单的 LOC 断点:b SomeModule.d:42
- 调试器回复新断点的内存地址。
然而,当我 run
来自调试器的程序时,它在与 SomeModule.d:42
完全不同的地方停止了。我错过了什么?
D 默认是安全的,默认是垃圾回收的语言。 所以除了你自己的断点,程序经常会被垃圾收集器信号(SIGUSR1,SIGUSR2)打断。
在 GDB 中,这可以通过以下方式防止:
(gdb) handle SIGUSR1 nostop noprint
Signal Stop Print Pass to program Description
SIGUSR1 No No Yes User defined signal 1
(gdb) handle SIGUSR2 nostop noprint
Signal Stop Print Pass to program Description
SIGUSR2 No No Yes User defined signal 2
更好的是,通过将上述 2 个命令放在一个文件中并使用 -x gdb_command_file
.
对应的LLDB-ese发音不同:
(lldb) process handle --stop false --notify false SIGUSR1 SIGUSR2
我是 not sure it's possible to automate it similarly with LLDB alone。