好久没用GDB调试过C++程序了,今天需要调试一下,所以记录一下。
首先在编译的时候一定要加上-g选项告诉编译器在编译的时候要包含debug信息。
然后用gdb运行你的可执行程序
gdb your_program
show args 列出命令行参数
list 列出源代码
回车 重复上一命令
break 22 在22行设置断点
info break 查看断点信息
break handle_login 在函数handle_login设置断点
clear handle_login 取消handle_login的断点
disable handle_login 暂时时断点失效
enable handle_lgoin 恢复断点
b main.cpp:213 设置源文件行断点,若出现no source file named,你可以用directory告诉源文件所在目录
directory "/home/zhc/project/db_server/src"
watch login_name 当login_name发生变化时,会断住
run 运行程序,到断点处自动停住
next 执行下一行命令
step 进入一个指令内部, 相当于step in
step out 跳出
continue 到下一断点
print name 打印name变量
set name 123 动态的改变变量的内容
print *array@len 打印动态数组array指针指向的内容,长度是len
set print object on 开启派生类对象信息
set print pretty on 树形打印对象成员
display name 自动显示name的内容
undisplay name 取消自动显示name的内容
info local 显示局部变量
info display 查看所有display的信息
bt 查看函数堆栈
finish 退出函数
return 1 强制当前函数返回1,忽略还没有执行的语句。
info threads 查看线程信息
thread 3 切换到线程3,有时候因为有阻塞在,比如调用数据库,那么gdb会自动帮你切换到可以运行的线程,这样不利于调试,可以将自动切换线程关闭。
set scheduler-locking on 只调试当前线程。
set scheduler-locking off 调试所有线程,gdb的默认值是这个。
break handle_login thread 1 只在线程1里对handle_login进行断点
help 如果你忘了命令,可以用这个命令查看
quit 退出gdb
以上所有的命令都可以简写,只要gdb能认出即可,比如break可以只写一个b
刚才我们用gdb直接去调试可执行文件,还有其它几种类型的调试方法,比如你有一个core dump文件,你的程序不知道什么原因崩溃了,你可以这样进行调试,详细内容可参考GDB调试core文件:
gdb your_program -c core_file
再比如说你想调试一个正在运行的程序,比如一个service,你可以用进程ID来调试:
gdb your_program PID
gdb会自动attach上去,your_program应该在PATH环境变量中搜索的到才行。
原文:http://blog.youkuaiyun.com/hongchangfirst/article/details/51336461
作者:hongchangfirst
hongchangfirst的主页:http://blog.youkuaiyun.com/hongchangfirst