linux中gdb进程遇到的问题和坑
文章目录一、非生产环境中可以gdb到一个进程里面,但是有时候停顿太久,gdb附身到这个进程会挂掉,这时候就需要杀死这个gdb进程二、gdb调试程序的时候,有时gdb会因为某些原因crash掉。这时被调试的那个进程往往就成了僵尸进程。这种僵尸进程用killall是杀不掉的,用kill -9或者kill -SIGKILL也是杀不掉的,甚至退出用户登录也杀不掉。很多人这时候只好reboot机器。三、gd
文章目录
一、非生产环境中可以gdb到一个进程里面,但是有时候停顿太久,gdb附身到这个进程会挂掉,这时候就需要杀死这个gdb进程
开启另一个终端 root权限执行
ps -A|grep gdb
可查出 gdb进程号
再用
kill -9 进程号
可强制停止kill该进程
二、gdb调试程序的时候,有时gdb会因为某些原因crash掉。这时被调试的那个进程往往就成了僵尸进程。这种僵尸进程用killall是杀不掉的,用kill -9或者kill -SIGKILL也是杀不掉的,甚至退出用户登录也杀不掉。很多人这时候只好reboot机器。
但是可以用kill -18就能杀掉gdb产生的僵尸进程。信号18是SIGCONT,这个信号可以让停在断点上的进程继续运行。
维基百科上说:
When SIGSTOP is sent to a process, the usual behaviour is to pause that process in its current state. The process will only resume execution if it is sent the SIGCONT signal. SIGSTOP and SIGCONT are used for job control in the Unix shell, among other purposes. SIGSTOP cannot be caught or ignored.
- job control意思
Job control (workplace), the ability of a person to influence what happens in their work environment
三、gdb的print打印默认打印不全
使用set print element 0 设置后就能完整显示了
四、让被gdb调试的程序能够接受信号
-
法一:
使用singal命令可以产生一个信号量给被调试的程序。如中断信号Ctrl+C。这非常方便于程序的调试,可以在程序运行的任意位置设置断点,并在该断点用gdb产生一个信号量。精确地在某处产生信号非常有利程序的调试。 其语法是: signal Linux的系统信号量通常从1到15。所以的取值也在这个范围。 signal命令和shell的kill命令不同,系统的kill命令发信号给被调试程序时,是由gdb截获的,而signal命令所发出的信号则是直接发给被调试程序的。 -
法二:(改变gdb对特定信号的处理)
handle SIGINT nostop print 告诉gdb在接受到SIGINT时不要停止,并把该信号传递给目标调试程序
五、函数明明存在,添加断点却无效
使用结果break 函数名字添加断点,gdb却提示make breakpoint pending on future shared lirary load ? y or n,输入y却没用,添加的断点也不会触发,需要改成
b 文件:行号 ,这样就能添加同样效果的断点了
六、断点的类型,这里只介绍条件断点
断点的类型:普通断点、条件断点、硬件断点(watch)
条件断点:
法一:b 文件名:行号 if 条件
法二:b 文件名:行号
condition 断点序号 条件
更多推荐
所有评论(0)