gpt4 book ai didi

delphi - 如何从 Delphi 程序或编译器生成的调试信息中提取局部变量信息(地址和类型)?

转载 作者:行者123 更新时间:2023-12-03 14:32:26 29 4
gpt4 key购买 nike

我的目标是:

  • 给定 Delphi 编译的 32 位或 64 位 Windows 程序中的挂起线程,遍历堆栈(可行)
  • 给定堆栈条目,枚举每个方法中的局部变量及其值。也就是说,至少找到它们的地址和类型(整数32/64/有符号/无符号、字符串、 float 、记录、类...),它们的组合可用于找到它们的值。

第一个很好,这个问题涉及的是第二个。在较高的层次上,如何在 Delphi 中枚举给定堆栈条目的局部变量?

<小时/>

在较低的层面上,这就是我一直在调查的内容:

RTTI:不列出此类有关方法的信息。我实际上认为这不是一个现实的选择,但无论如何都列在这里。

调试信息:加载为调试版本生成的调试信息。

  • map 文件:即使是详细的 map 文件(文本格式的文件!打开一个看看)也不包含局部变量信息。它基本上是地址和源文件行号的列表。非常适合地址到文件和行的关联,例如排水沟中的蓝点;不太了解更多详细信息
  • 远程调试信息(RSM 文件)- no known information其内容或格式。
  • TD32/TDS 文件:我当前的研究方向。它们包含全局和本地符号以及许多其他信息。

我在这里遇到的问题是:

  • 没有 TD32 文件格式的文档(我可以找到)。
  • 我对它们的大部分了解都来自使用它们的 Jedi JCL 代码 (JclTD32.pas),我不确定如何使用该代码,或者其中的结构是否足够广泛以显示本地变量。我非常确定它会处理全局符号,但我对本地符号非常不确定。定义了各种各样的常量,并且没有格式文档,要阅读它们的含义,我只能猜测。然而,这些常量和它们的名字一定来自某个地方。
  • Source I can find using TDS info不加载或处理本地符号。

如果这是正确的方法,那么这个问题就变成“是否有 TDS/TD32 文件格式的文档,以及是否有加载局部变量的代码示例?”

代码示例不是必需的,但可能非常有用,即使它非常少。

最佳答案

检查是否有任何调试符号不是二进制的。也可以使用 GDB(在 Windows 上的一个端口它)。如果您找到 .dbg 或 .dSYM,那就太好了文件。它们包含源代码,例如。

gdb> list foo
56 void foo()
57 {
58 bar();
59 sighandler_t fnc = signal(SIGHUP, SIG_IGN);
60 raise(SIGHUP);
61 signal(SIGHUP, fnc);
62 baz(fnc);
63 }

如果您没有任何调试文件,您可以尝试获取 MinGW 或 Cygwin,并使用 nm(1) ( man page )。它将从二进制中读取符号名称。它们可能包含一些类型,例如 C++ 类型:

int abc::def::Ghi::jkl(const std::string, int, const void*)

别忘了添加 --demangle 选项,否则你会得到类似的结果:

__ZN11MRasterFont21getRasterForCharacterEh

而不是:

MRasterFont::getRasterForCharacter(unsigned char)

关于delphi - 如何从 Delphi 程序或编译器生成的调试信息中提取局部变量信息(地址和类型)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29990745/

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