转自:http://blog.youkuaiyun.com/wuzh1230/article/details/7188822
gdb常用命令
本机调试
带参数启动
gdb --args ./program arg1 arg2 arg3
在main()处断点
break main
启动以后设置参数运行
run arg1 arg2 arg3
取消参数开始运行
set args
run
设置参数
set args arg1 arg2 arg3
run
分析core文件
gdb ./test ./test.core
gdb --core=./test.core ./test
gdb ./test 2640
gdb --pid=2640 ./test
远程调试
目标机器
gdbserver 127.0.0.1:1234 ./test
主机:
target remote 127.0.0.1:1234
break main
run
调试控制命令:
step 单步,参数N表示单步几次,一般可以用作步入到 子函数 调用中去。(vc++的F11,windbg的t)
stepi 指令集的step,一般在汇编窗口调用。
next 类似单步,只不过把子函数调用当做一个指令预先执行掉,不跟进去。(vc++的F10, windbg的p)
nexti 指令集的next,一般在汇编窗口调用。
until 执行到比当前行号大的一行为止。用作步出循环体,这个时候刚好在循环体的最后一行,可以执行这个步出循环。
finish 执行到当前栈即将返回的位置。用于将当前函数执行完毕返回。(vc++的shift+F11,windbg的pt,tt,wt)
advance 推进到某个位置 advance 27表示推进到27行,(vc++的ctrl+F11, windbg的pa, "step to address")
jump 跳到某个指令直接执行, jump 27 直接跳到27行开始执行,最好在27行之后某个位置断点一个看看。(windgb的r eip=0x41000100)
断点指令:
break main 函数名断点
break test.c : 27 文件的27行断点
break *0x00000000004005f0 在汇编指令的地址处断点, 前面有一个星号
硬件数据断点
awatch 访问断点 access watch; awatch i, 当i被访问的时候,程序断开。(类似于windbg的ba断点)
watch 写入数据断点, watch i 当i的值被修改的时候,断开。
rwatch 读取断点, 当i的值被读取的时候断开。
hbreak 硬件指令断点, hbreak *0x0000000000400606 在这个地址设置硬件断点
条件断点:
在循环体的11行断点,只有循环计数器是50的时候断开。
- (gdb) break 11 if i=20
- Breakpoint 2 at 0x4005c9: file test.cxx, line 11.
- (gdb) info breaks
- Undefined info command: "breaks". Try "help info".
- (gdb) info break
- Num Type Disp Enb Address What
- 1 breakpoint keep y 0x00000000004005c0 in foo() at test.cxx:9
- breakpoint already hit 1 time
- 2 breakpoint keep y 0x00000000004005c9 in foo() at test.cxx:11
- stop only if i=20
- (gdb) c
- Continuing.
- 0
- Breakpoint 2, foo () at test.cxx:11
- 11 printf("%d\n",i);
- (gdb) p i
- $1 = 20