原博客链接
补充内容
输入的代码
使用gcc - g example.c -o example -m32
指令在64位的机器上产生32位汇编
删除gcc产生代码中以"."开头的编译器指令,针对每条指令画出相应栈帧的情况
使用gdb example
指令进入gdb调试器
使用“r”命令执行(Run)被调试文件,因为尚未设置任何断点,将直接执行到程序结束:
使用“b”命令在 main 函数开头设置一个断点(Breakpoint):
上面最后一行提示已经成功设置断点,并给出了该断点信息:在源文件 test.c 第13行处设置断点;这是本程序的第一个断点(序号为1);断点处的代码地址为 0x80483f9(此值可能仅在本次调试过程中有效)。回过头去看源代码,第13行中的代码为“return f(8)+1”,恰好是 main 函数中的第一个可执行语句。
再次使用“r”命令执行(Run)被调试程序:
程序中断在test.c第13行处,即main函数是第一个可执行语句处。
上面最后一行信息为:下一条将要执行的源代码为“return f(8)+1;”,它是源代码文件test.c中的第13行。
下面使用“s”命令(Step)执行下一行代码(即第13行“return f(8)+1;”):
上面的信息表示已经执行完“return f(8)+1;”,并显示下一条要执行的代码为第8行的“return g(x);”。
使用disassemble
指令获取汇编代码
用i(info) r(registers)指令查看各寄存器的值:
display /i $pc
在每次执行下一条汇编语句时,都会显示出当前执行的语句
call指令将下一条指令的地址入栈
frame
打印出的信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。
info frame
打印出的信息:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等。
使用 up
down
,跳转不同堆栈,查询其中的堆栈简要信息
剩余内容参考卢肖明同学的博客,内容一样,就不一一贴图了,附上卢肖明同学的博客链接