一、编译,生成执行文件,预处理 -> 编译(译为汇编代码) -> 汇编 -> 链接 -> 可执行文件
- gcc,g++
- gcc -g hello.c -o hello
- g++ -g hello.cpp -o hello
-
gcc main.c -o gdb-sample -g // 生成调试文件使用// -o 参数指定了编译生成的可执行文件名为 gdb-sample,使用参数 -g 表示将源代码信息编译到可执行文件中gdb // 开始执行gdb命令file gdb-sample // 打开生成的gdb文件
- make,需先手动/自动生成Makefile文件,make内置gcc,g++
- makefile:cmake -DCMAKE_DEBUG_TYPE=debug --> make,调试版本与发布版本
- 根据Makefile内容可生成是否具有调试信息的可执行文件
二、查看文件依赖项
- ldd
- ldd program(可执行文件) 查看当前可执行文件运行库支持
- ldd /bin/ls 查看当前链接的库地址
- pmap
- objdump -p /usr/local/php/bin/php |grep NEEDED
- pmap pid |head 查看当前进程pid,使用哪些运行库
三、gdb/cgdb调试:
- 启动 >> gdb与cgdb的区别是后者分页能看到当前代码页,便于使用者阅读:
- 未有pid,cgdb/gdb program
- 已有pid,cgdb/gdb program pid ,改pid为需要调试程序,如果program为服务程序,就可以将pid程序用gdb来调试,也可分两步执行,先启动program,然后在命令输入pid
- r(run),启动
- cgdb program core,core为当前program程序运行异常崩溃,直接启动可以显示崩溃信息(堆栈内容,PS:有时需要设置系统命令“ulimit -c unlimited”才能产生core文件)
- cgdb窗口切换,按esc键可让输入焦点进入到vi窗口,再按i键回到gdb窗口。按其它键也可以进入到vi窗口,比如小键盘上的按键(如果此时Num Lock处于打开状态)
-
start >> 开始执行程序,停止在main函数开始处
- 打印
- 普通类型变量:p var (p /x var 十六进制显示)
- x 按十六进制格式显示变量
- d 按十进制格式显示变量
- u 按十六进制格式显示无符号整型
- o 按八进制格式显示变量
- t 按二进制格式显示变量
- a 按十六进制格式显示变量
- c 按字符格式显示变量
- f 按浮点数格式显示变量
- 指针*val: p *var;boost::shared_ptr<T> val,p ((*T)var)->name(or function),p val->px->name(or function)
- 非指针类型地址val: p &var
- 数组a:p *a@10显示 数组a内的10个元素
- call function,执行function方法,直接显示返回值,如果返回为void,不显示
- p function,与call类似,返回值为void也就显示
- info
- info files 查看当前调试文件信息
- info break 查看断点信息
- info frame 查看当前方法语言
- info local 显示当前函数局部变量信息
- info var 显示所有全局及静态表里名称
- info func 显示所有函数名称
- info prog 显示被调试程序执行状态
- info signals 显示gdb支持哪些信号
- 线程、堆栈
- bt,查看堆栈
- f number 查看当前number代码
- up 上移一栈,使得当前为执行函数
- down 下移一栈
- info threads 查看当前所有线程,其中前面加“*”线程为当前运行线程
- thread id 切换当前调试线程位制定id的线程,适用于多线程环境
- thread apply id1 id2 command 线程id1 id2执行command命令
- thread apply all command 所有线程执行command命令
- where 查看程序出错地方
- 多线程 set scheduler-locking off|on|step,使用多线程调试会发现,在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,可设置此参数来防止其它线程执行
- off不锁定任何线程,也就是所有线程都执行,这是默认值
- on只有当前被调试程序会执行
- step在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行
- 查看文件
- list n1 n2 显示当期啊弄文件n1行到n2行之间的代码
- list file:number 显示file文件number行附近代码
- list file:function function函数代码
- 其它
- jump number 强制跳转到 number 行执行
- n 执行下一行
- s 单步执行,进入函数内部
- enter 执行上一步操作
- return 返回当前调用
- until 执行当前循环下一行
- until file:number 执行到当前number行
- finish 执行完成当前调用方法
- kill 终止当前调试进程
- file app 载入app可执行程序,调试
- show
- show language 查看当前语言
- show args 显示缺省参数列表
- whatis var 显示变量var类型
- ptype var 显示变量类型,如果var是结构体会显示全部内容
- set
- set args no修改启动参数,参数args[1]为no,也可启动r + 参数,如 r no
- set language c++ 手动设置当前程序语言为c++
- set language 查看可设置语言
- set variable i=1 设置成员变量值
- 断点
- info break 显示断点
- b file:number 下断点
- b file:number if(condition) 下断点,满足condition时,停止
- b file:number thread id if(condition) id为线程id
- del break num 删除num行断点
- disable break num 禁用断点
- enable break num 启用断点
- enable once break num 启用一次后禁用
- clear 删除刚才停止处断点
- clear file:number 清除number行所有断点
- watch i>100 监视,当i满足这个条件是,停止
- 信号signal,gdb可接受外部信号来处理当前程序状态
- 多进程
set follow-fork-mode child
set detach-on-fork off