gpt4 book ai didi

python - 遗留 GDB 脚本中堆栈跟踪的停止条件

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:17 29 4
gpt4 key购买 nike

我有一个遗留的 GDB 命令脚本,用于基于 Python 2.6 源代码附带的 GDB 脚本获取 Python 堆栈跟踪(所以不允许超链接,但这是 URL: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

对于我要调试的程序,针对 Py_MainPy_GetArgcArgv 的检查不会很好地工作,所以我正在寻找一个循环条件,它将当它到达 main 时评估为 false。

所以我一直在考虑使用程序计数器、帧指针和堆栈指针的想法,因为如果 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

我认为这应该可以解决问题,初步检查表明它工作正常。但是,我不太熟悉编译器可以进行的各种优化,而且我担心可能存在极端情况,在这种情况下,它们可能在堆栈中间的某个地方有效地相同。

看起来 $fp 对于帧指针已被优化掉的调用可以为零(例如,通过使用 GCC 使用 -g -O3 进行编译)。我也不确定是否可以依赖 $pc 来有所不同,尤其是在递归调用发生的情况下。我希望 $sp 会有所不同,同时仍有有效的堆栈要处理,但我模糊地怀疑与 tail recursion 相关的优化可能导致 $sp 相同。

如有任何建议,我们将不胜感激。

具体问题:

问题 1:在遗留(非 Python)GDB 脚本中是否有更好的方法来确定您是否位于堆栈的顶部?

问题 2:我对 $sp$pc$fp 的假设对大多数人是否成立还是所有的优化场景?

最佳答案

所以我没有问题 1 的答案,但我想我可以部分回答问题 2

Tail recursion确实会重用现有的堆栈指针和帧指针。这对于堆栈跟踪意味着,对同一个优化尾递归函数的多次调用只会在 GDB 中显示一次,因为(显然)堆栈指针被重用(并且没有新的堆栈或帧指针被压入)。

这似乎意味着您可以检查 $sp 的先前和当前值来确定停止条件。不幸的是,堆栈中间的 $sp 值可能是相同的。当一些函数调用被优化掉时,这似乎会发生。

所以我在问题中提出的停止条件可能相当脆弱,尽管它适用于几个现实世界的例子。

关于python - 遗留 GDB 脚本中堆栈跟踪的停止条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22856807/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com