一、程序core了,可能会这样调试:
1. 首先gdb会告诉你程序怎么崩了,例如:Program terminated with signal 11, Segmentation fault。
2. 然后你开始找错在哪里:
backtrace | bt :列出当前堆栈的跟踪,函数。
frame | f [number]:选择指定的栈帧。或者使用 up | down [number] 来上下跳转栈帧。
list | l [line-number|function|-|start#,end#|filename:function] :列出源代码。
info [arg|locals|catch|all-reg] :列出参数,局部变量,异常处理,寄存器。这个命令还有很多选项,help info查看一下。
3.如果这时觉得变量太多了,可以这样一个个观察:
print | p [variable|file::variable|'file'::variable] :打印指定变量值。
print | p[x|d|u|o|t] var :以 十六,有符号,无符号,八,二进制 打印变量。
4.有些问题需要观察一段地址的数据值才能发现:
print | p *array-var@length :打印arrary-var中的前length项
x [/FMT] address : FMT is a repeat count followed by a format letter and a size letter.
Format letters are:
o(octal), x(hex), d(decimal), u(unsigned decimal),t(binary), f(float), a(address), i(instruction), c(char) and s(string).
Size letters are:
b(byte), h(halfword), w(word), g(giant, 8 bytes).
The specified number of objects of the specified size are printed according to the format
例,x/32xb 0xab1fefec
0xab1fefec: 0xb7 0xbd 0xcc 0xec 0xea 0xaa 0x00 0x00
0xab1feff4: 0x09 0x00 0x00 0x00 0x08 0x00 0x00 0x00
0xab1feffc: 0x01 0x00 0x00 0x00 Cannot access memory at address 0xab1ff000
然后。。。就找到了问题的所在。读取了不可访问地址(Segmentation fault),就像GDB一开始告诉你的那样。
版权声明:本文为博主原创文章,未经博主允许不得转载。