GDB在断点触发时,怎样查看当前函数调用栈的信息?怎样在调用栈中回溯调用栈中各个函数中的变量值等?
在 GDB 中,当断点触发时,查看当前函数调用栈的信息以及在调用栈中回溯查看各个函数中的变量值是调试程序时非常重要的操作。下面是详细的步骤和命令,用于查看调用栈和回溯函数中的变量值:
查看当前函数调用栈
- 使用 backtrace 命令
- 查看完整的调用栈(gdb) backtrace
- 或其简写:(gdb) bt
- 该命令会显示当前线程的调用栈,包括每个栈帧的函数名、源文件及行号,以及函数调用的参数。
- 使用 info stack 命令
- 查看调用栈的详细信息(gdb) info stack
- 这与 backtrace 命令类似,提供了当前调用栈的详细信息。
- 查看特定栈帧
- 查看特定栈帧的信息(gdb) frame <帧编号>
- 其中 <帧编号> 是 backtrace 命令输出中的栈帧编号。例如:(gdb) frame 2
- 这个命令会将当前栈帧切换到编号为 2 的栈帧,并显示该栈帧的函数信息。
回溯调用栈中的各个函数中的变量值
- 切换到特定栈帧
- 切换到指定的栈帧(gdb) frame <帧编号>
- 例如:(gdb) frame 2
- 这将使你查看栈帧编号为 2 的函数的上下文。
- 查看当前栈帧的局部变量和函数参数
- 查看局部变量
(gdb) info locals - 这个命令列出当前栈帧中的所有局部变量及其值。
- 查看函数参数
(gdb) info args - 这个命令列出当前栈帧的所有函数参数及其值。
- 查看局部变量
- 使用 print 命令
- 查看特定变量的值(gdb) print <变量名>
- 例如:(gdb) print myVar
- 你可以在切换到特定栈帧后使用 print 命令查看该栈帧中任何变量的值。
- 自动显示变量
- 自动显示特定变量的值(gdb) display <变量名>
- 例如:(gdb) display myVar
- 这将使 GDB 在每次断点触发时自动显示 myVar 的值。
示例操作流程
假设你在函数 foo 的断点处停下了,你想要查看函数 foo 及其调用者 bar 的变量值:
- 查看调用栈
(gdb) backtrace - 切换到 bar 函数的栈帧(假设其编号为 1)
- (gdb) frame 1
- 查看 bar 函数中的局部变量和参数
- (gdb) info locals
- (gdb) info args
- 切换到 foo 函数的栈帧(假设其编号为 0)
- (gdb) frame 0
- 查看 foo 函数中的局部变量和参数
- (gdb) info locals
- (gdb) info args
总结
- 查看调用栈:使用 backtrace 或 info stack 命令查看调用栈信息。
- 切换栈帧:使用 frame <帧编号> 命令切换到特定栈帧。
- 查看变量:使用 info locals、info args 和 print <变量名> 命令查看当前栈帧中的变量值。
- 自动显示变量:使用 display <变量名> 命令来自动显示变量的值。
这些操作可以帮助你在调试过程中深入了解程序的执行状态和变量的具体值。