gdb使用汇总
查看信号
i signals
设置SIGUSR两个信号不中断
handle SIGUSR1 SIGUSR2 nostop noprint
handle SIGHUP nostop noprint nopass
handle SIGCONT nostop noprint nopass
可以停留在当前线程
set scheduler-locking on
可以停留在源文件的某个位置
b postgres.cpp:2590 if strcmp(query_string, "SELECT * FROM gtest22c WHERE b * 3 = 6;") == 0
这个可以断住错误的地方
b errstart if elevel == 20
gdb
attatch
detach #调试结束,解除进程与gdb的连接,使进程继续运行;
直接在gdb中把一个正在运行的进程连接到gdb中,以便于进行动态调试;使用attach命令:
attach <进程ID>
当使用attach命令时,你应该先使用file命令来指定进程所联系的程序源代码和符号表;当gdb接到attach命令后的第一件事情就是停止进程的运行,你可以使用所有gdb的命令来调试一个已"连接"到gdb的进程,这就像你使用run/r命令在gdb中启动它一样.如果你要进程继续运行,那么,可以使用continue/c命令就可以了;
detach:
当你调试结束之后,可以使用该命令断开进程与gdb的连接(结束gdb对进程的控制),在这个命令执行之后,你所调试的那个进程将继续运行;
如果你在使用attach命令把一个正在运行的进程连接到gdb之后又退出了gdb,或者是使用run/r命令执行了另外一个进程,那么刚才那个被连接到gdb的进程将会因为收到一个kill命令而退出;
如果要使用attach命令,你的操作系统环境就必须支持进程;另外,你还需要有向进程发送信号的权力;
使用attach命令的例子:
gdb
file <可执行程序名> #指定进程所关联的程序源代码和符号表
attach <进程ID>
.....
使用gdb的命令进行调试;
.....
detach #调试结束,解除进程与gdb的连接,使进程继续运行;
https://www.cnblogs.com/whiteyun/archive/2011/10/17/2215532.html
.gdbinit使用
https://blog.csdn.net/bangdingshouji/article/details/52889937?spm=1001.2101.3001.6650.9&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-9.highlightwordscore&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-9.highlightwordscore
https://github.com/gdbinit/Gdbinit/blob/master/gdbinit
i thread显示所有线程
gdb 打印宏
参考https://blog.csdn.net/zhangjs0322/article/details/39666889
编译器默认没有把宏定义扩展信息编译进二进制文件。
通过man gcc查看说明,如下
编译时需添加-gdwarf-2和-g3两个参数。 加了-g3的参数后,gcc编译的时候,会将扩展的debug 信息编译进二进制文件里面,包括宏定义信息。 结论:
在CFLAGS参数后添加-g3 -gdwarf-2参数
重新编译、gdb调试宏,如下
gdb内执行shell指令
两种方式,shell command | !command
.
第一种是用内置指令shell
.
第二种是用特殊符号!
开头.