【start&run】
使用run/r或者start命令,GDB建立子进程来运行被调试程序。run和start命令稍有不同,即run仅仅加载程序然后运行,而start会在程序的入口函数(main)设置一个临时断点,程序运行到那里就会暂停,临时断点也随即被清除。另外run和start命令后面都可以加上传递给被调试程序的参数,若不加参数则使用GDB启动时传递的参数或者使用set args命令设置的参数。
[设置断点]
b 12 表示在12行设置断点 : 这里的断点设置在这个项目的主程序文件里面在,如果要在其他文件设置断点,需要加上其他文件名称例如 :
b uploadmgr.c:upload 表示在uploadmgr.c文件的upload函数打上断点。
b uploadmgr.c:12 表示在uploadmgr.c文件的12行打上断点.
d n : 删除指定编号的某个断点
rbreak 可以用正则表达式来设置断点,这个还是比较有用,比如你想给一个文件所有函数设置断点:
rbreak xxx.c:*
就行了,但是有个要求,你这个程序必须已经处于调试状态了,也就是run 之后来设置才有效。不然设置了没反应。
info b: 查看断点
[layout模式]
layout : 进入layout模式
ctrl + x + a : 进入layout模式
-argc 给启动的程序传递参数
[打印变量]
当我们要打印某个复杂变量的时候,可以先用pt 打印出改变量的数据结构,然后在打印比较感兴趣的值。比如:
(gdb) pt progress
type = struct RequestReader::PostProgress {
apr_uint32_t id;
apr_uint64_t total_size;
apr_uint64_t read_size;
apr_time_t end_time;
bool is_succeeded;
apr_size_t item_id;
}
p 打印变量的值
[继续运行]
c : 继续运行
r : 从头开始跑程序