Rob*_*Rob 5 c c++ python gcc gdb
我有获得基于一个GDB的Python脚本的堆栈跟踪附带的Python 2.6源的传统GDB命令脚本(SO不允许超链接,但这里的网址:http://#%20http://svn.python.org/view/*checkout*/python/branches/release26-maint/Misc/
)
该脚本有一个 while 循环,它根据要退出的程序计数器进行相当脆弱的检查,这(如注释中的原始代码中所述)可能仅适用于直接运行 Python 的情况,而不适用于解释器是从 C/C++ 应用程序中启动。
现有的 while 循环如下所示:
while $pc < Py_Main || $pc > Py_GetArgcArgv
# ...
# code for extracting Python stack from local vars in relevant frames
# of C stack
# ...
up-silently 1
Run Code Online (Sandbox Code Playgroud)
对于我想要调试的程序,检查Py_Main
并Py_GetArgcArgv
不会很好地工作,所以我正在寻找一个循环条件,当它到达main
.
所以我一直在考虑使用程序计数器、帧指针和堆栈指针的想法,基于如果up-silently
失败,它们将具有与以前相同的值,这意味着我在顶部堆栈,像这样:
set $oldpc = -1
set $oldfp = -1
set $oldsp = -1
while !($oldpc == $pc && $oldfp == $fp && $oldsp == $sp)
# ...
# code for extracting Python stack from local vars in relevant frames
# of C stack
# ...
set $oldpc = $pc
set $oldsp = $sp
set $oldfp = $fp
up-silently 1
Run Code Online (Sandbox Code Playgroud)
我认为这应该可以解决问题,初步检查表明它工作正常。但是,我对编译器可以执行的各种优化并不太熟悉,我担心可能会出现极端情况,它们可能在堆栈中间的某处有效相同。
$fp
对于帧指针已被优化掉的调用(例如,通过-g -O3
使用 GCC进行编译),它看起来可能为零。我也不确定是否$pc
可以依赖于不同,特别是如果发生递归调用。我希望$sp
在仍有要处理的有效堆栈时会有所不同,但我有一个模糊的怀疑,即与尾递归相关的优化可能会导致 $sp 相同。
任何建议将不胜感激。
具体问题:
问题 1:在遗留(非 Python)GDB 脚本中是否有更好的方法来确定您是否处于堆栈顶部?
问题2:请问我的假设$sp
,$pc
并$fp
持有多数或全部优化方案真的吗?