标签:
在GDB中运行程序
一、启动程序
如果在启动gdb时没有指明程序,可以使用命令file或exec-file加载程序;
run(r):
run(r)命令使程序启动,可以在run命令中指明程序参数;值得注意的是,首次运行run后,如果再次执行run并且不带参数,会以之前的参数运行程序。
set args:
指定程序的参数。set args后,run可以不带参数而以指定的参数运行程序。如果set args不太参数,清楚程序参数,执行run后程序不太参数运行。
在加载程序后,如果程序重新编译,gdb会根据符号文件的更改时间自动重载加载符号文件,所以,不需要重新加载文件。
start:
使用start命令使程序停在main函数的第一条语句。
二、调试已经在运行的程序
attach pid:
从ps获得进程号,通过attach命令连接到该进程。attach一个进程后,gdb首先stop该进程,这样就可以设置断点,执行step、continue等命令;如果执行r命令,会杀掉原来的进程。
detach:
释放该进程,原进程会继续执行。
三、调试多个inferiors和程序
gdb允许在一个会话下调试多个程序,比如一个进程fork出两个或者多个进程,或者把当前程序复制出一个副本,这些都是通过inferior实现控制。
info inferiors:
显示当前管理的inferiors。
inferior infono:
切换到对应的inferior。
add-inferior [-copies n] [-exec executable]:
添加n(默认为1)个inferior,如果指明executable文件,可以以后通过file加载符号文件。
clone-inferiror [-copies n] [infno]:
复制编号为infno(默认为当前)的inferior。
其它相关命令:
remove-inferiors infno
detach inferior infno
kill inferiors infno
maint info program-spaces
四、调试fork
默认情况下,当一个程序fork,gdb会跟踪父进程而子进程畅通无止的执行。如果在child中设置了一个断点,执行到断点处,child会收到一个SIGTRAP信号,默认为终止程序。
最开始调试child进程的方法是在child中设置一个sleep,然后通过attach连到child。
set follow-fork-mode mode
show follow-fork-mode:
在Linux2.5.46以后,gdb支持fork函数的调试;通过set-follow-mode命令,设置跟随parent还是child,如果不设置默认为跟随parent。
set detach-on-fork mode
show detach-on-fork:
在Linux,可以通过set detach-on fork off命令,在fork后,对parent和child都进行调试。父、子进程为多个inferiors,参见第三部分。
五、多线程调试
info threads:
显示线程信息。
thread thread-id:
切换到对应线程。
thread name [name]:
修改当前thread的名称。默认为程序名称。
/******************************************************************
* 本文为博主学习Debugging with GDB的读书笔记,版权所有,转载请注明出处。
*
******************************************************************/
标签:
原文地址:http://www.cnblogs.com/homeX/p/5461133.html