1. 断点设置
本节将继续使用 bugging 程序,首先确认之前有执行过以下命令
-
建立32位可执行程序编译环境
$ sudo apt-get update
$ sudo apt-get install gcc-multilib
-
构建 bugging 可执行程序
$ gcc -g -obugging bugging.c -m32
-
设置断点
$ gdb bugging
(gdb) break foo
(gdb) info breakpoints
在 foo 函数处设置了一个断点
2. 函数与函数栈
进程在内存空间会拥有一块叫做 stack 的区域,函数内部的局部变量、函数之间调用时参数的传递和返回值等等都会用到栈这种数据结构
-
info proc mappings 可以查看待调试进程的内存分布情况
(gdb) run
(gdb) info proc mappings
从进程的地址空间分配情况可以看到,有一块区域 [stack],这就是该进程的 栈空间
-
backtrace 查看函数调用栈的情况
-
backtrace、where、info stack
这三个命令都可以查看函数的调用情况
-
backtrace full、where full、info stack full
这三个命令查看函数调用情况的同时,打印所有局部变量的值
-
栈帧(stack frame)
#1 是 main 函数用到的栈空间,这一部分可以称之为 main 函数的 stack frame
#0 是 foo 函数用到的栈空间,同样可称之为 foo 函数的 stack frame,0 代表当前执行停在 foo 函数内
可以得到函数调用关系为,main 调用 foo
info frame Num 查看某个函数栈帧的详细信息
-
-
本节并不详细介绍 函数与函数栈的理论知识,但是通过回溯栈,可以调试函数之间的调用关系、局部变量值的变化等。所以还是需要理解一些基本概念,可以看一下这篇文章
3. 函数栈小结
这一节主要介绍了函数栈相关的知识。主要是几个栈相关的命令。
backtrace
backtrace full
info frame
不熟悉命令的时候,记得在 gdb 命令行下键入 help backtrace
等命令,查询帮助文档