对于调试多线程程序,GDB 默认采用的是 all-stop 模式,即只要有一个线程暂停执行,所有线程都随即暂停。这种调试模式可以适用于大部分场景的需要,借助适当数量的断点,我们可以清楚地监控到各个线程的具体执行过程。
但在某些场景中,我们可能需要调试个别的线程,并且不想在调试过程中,影响其它线程的运行。这种情况下,可以将 GDB 的调试模式由 all-stop 模式更改为 non-stop 模式,该模式下调试多线程程序,当某一线程暂停运行时,其它线程仍可以继续执行。
关于all-stop与non-stop的介绍,可参考 https://www.cnblogs.com/jkin/p/13865298.html
可采取如下步骤开启 non-stop模式(以调试mysqld为例):
1. 以gdb启动mysqld
2. 设置:
set target-async 1
set pagination off
set non-stop on
3. 设置函数断点,然后run
通过如上步骤可以开启non-stop模式,但对于初次接触gdb调试或者习惯使用vscode的朋友,直接gdb的命令行使用起来还是有些困难的。
那么使用vscode+gdb远程调试,如何启用non-stop模式?
经过本人一下午的研究,gdb除了可以通过set语句设置启用non-stop之外,还可以在用户目录下的.gdbinit 文件内添加set语句来进行配置。例如:
vi /home/user1/.gdbinit
set target-async 1
set pagination off
set non-stop on
配置以上文件后,在用户user1 下执行gdb,每次就启用non-stop。
同理,对于vscode+gdb的远程调试,也可以目标linux服务器上配置.gdbinit 文件,debug启动时,就会启用non-stop 模式。
以上,与需要的人分享、交流。
参考连接: