gdb堆栈跟踪

gdb 堆栈介绍

GDB将当前函数的栈帧编号为0,为外层函数的栈帧依次加1,这些编号将成为一些GDB命令的参数,以指明将要操作的是哪一个函数的栈帧。

GDB还支持使用Address作为栈帧的标识符,可在栈帧编号被破坏的情况下使用。

在栈帧之间切换

GDB中有很多针对调用堆栈的命令,都需要一个目标栈帧,例如打印局部变量值的命令。

  • frame args

    将当前栈帧设置为 args(编号或Address)指定的栈帧,并打印该栈帧的简要信息。

  • select-frame args

    frame args 相同,但是不打印栈帧信息。

  • up n

    向上回退 n 个栈帧(更外层),n 默认为1。

  • down n

    向下前进 n 个栈帧(更内层),n 默认为1。

  • up-silently n

    up n 相同,但是不打印信息。

  • down-silently n

    down n 相同,但是不打印信息。

打印栈帧信息

使用下面命令可以直接输出堆栈相关信息而不用移动栈帧。

  • frame

    打印当前栈帧的简要信息。

  • info frame

    打印当前栈帧的详细信息。

  • info frame args

    打印指定栈帧的详细信息。

  • info args

    打印函数参数信息。

  • info locals

    打印当前可访问的局部变量的信息。

打印调用堆栈

  • backtrace

    打印全部栈帧的简要信息,按 Ctrl+C 可终止打印。

  • backtrace n

    打印最内层的 n 个栈帧的简要信息。

  • backtrace -n

    打印最外层的 n 个栈帧的简要信息。

  • backtrace full

    打印全部栈帧的详细信息。

  • backtrace full n

    打印最内层的 n 个栈帧的详细信息。

  • backtrace full -n

    打印最外层的n个栈帧的详细信息。