编译C++:
g++ -g code.cpp –o code //linux下
g++ -g code.cpp –o code.exe //windows下
编译C:
gcc -g code.cpp –o code //linux下
gcc -g code.cpp –o code.exe //windows下
gcc是编译C的,g++是编译C++的,如果搞混可能编译不过报错。-g选项可以不加,但如果想用gdb调试,则一定要加。
正常运行:
>> ./code
Gdb调试运行:
>> gdb code
Gdb命令如下:如果连续输入同样的指令,可以直接使用回车
>>l list 列出下面10行代码。默认为10,也可以自定义。E.g. l 20
>>n next 运行下一行,运行单条代码
>>r run 运行
>>b 12 break 在第12行设断点 b func 在func函数处设置断点
>>info break 查看程序中所有的断点
>>c continue 继续运行
>>p i print变量值,此处是打印变量i的值
>>bt backtrace 查看函数的堆栈
>>step 单步跟踪
>>finish 退出函数
>>q 退出gdb
>>info frame 打印出当前更为详细的当前栈层的信息
>>info args 打印出大年函数的参数名和值
>>info locals 打印出当前函数中局部变量和值
>>info catch 打印出当前函数中的异常处理信息
>>watch expr 为变量或表达式expr设置一个观察点,一旦表达式值或变量有变化,马上停住
>>rwatch expr 当expr被读时停住程序
>>awatch expr 当expr的值被读或被写时停住程序
>> info watchpoints 列出所有已设置的观察点
>>catch event 设置捕捉点,捕捉程序运行时的一些时间,比如载入动态链接库、异常等
Event可以是:
Throw 一个C++抛出的异常
Catch 一个C++捕捉到的异常
Exec 调用系统调用exec
Fork 调用系统调用fork时
Vfork 调用系统调用vfork时
Load 或者 load libname 载入动态链接库时
Unload或者unload libname 卸载动态链接库时
Gdb中断点、捕捉点和观察点都算作停止点
>>clear 清楚所有以定义的停止点
>>clear func >>clear filename:func 清除所有设置在函数上的停止点
>>clear linenum >>clear filename:linenum 清除所有设置在指定行上的停止点
>>delete [breakpoints] [range] 删除指定的断点,breakpoints为断点号,若不指定断点号则删除所有断点,range是断点号的范围
>>disable [breakpoints] [range]disable掉所指定的停止点,breakpoints为断点号,不指定则disable掉所有停止点
>>enable [breakpoints] [range] enable所指定的停止点
gdb program是直接使用gdb于program程序上。
Gdb program core 可以同时调试一个运行程序和core dump
Gdb program pid 制定这个服务程序运行时的进程id,gdb会自动attach进行调试。program需要在PATH环境变量中可以搜索到。
Gdb启动时的参数:
-c -core 调试core dump文件
-s file\ -symbols file 从文件中读取符号表
-d dir\ -directory dir 加入一个源文件的搜索路径,默认为PATH环境变量