首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从Delphi程序或编译器生成的调试信息中提取局部变量信息(地址和类型)?

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

Stack Overflow用户
提问于 2015-05-02 00:17:27
回答 2查看 2.1K关注 0票数 105

我的目标是:

  • 在Delphi编译的32位或64位Windows程序中给出一个挂起的线程,以遍历(可做的)堆栈
  • 给定的堆栈条目,枚举每个方法中的局部变量及其值。也就是说,至少要找到它们的地址和类型(整数32/64/signed/unsigned,字符串,浮点数,记录,类...)它们的组合可以用来找到它们的值。

第一个问题很好,第二个问题是关于这个问题的。在较高的级别上,如何枚举给定堆栈条目的局部变量?

在较低的层次上,这是我一直在调查的:

RTTI:没有列出关于方法的这类信息。这并不是我真正认为是一个现实的选择,但不管怎样,在这里列出。

调试信息:加载为调试构建生成的调试信息。

  • 地图文件:甚至是详细的地图文件(文本格式文件!打开一个并查看)不包含本地变量信息。它基本上是一个地址和源文件行号的列表。非常适合于地址到文件和行的关联,例如排水沟中的蓝点;不适合于更详细的information
  • Remote调试信息(RSM文件)-关于其内容或format.
  • TD32/TDS文件的no known information我当前的研究行。它们在许多其他information.

中包含全局和局部符号

我在这里遇到的问题是:

  • 没有TD32文件格式的文档(我能找到)。
  • 我对它们的大部分知识来自于使用它们的Jedi JCL代码(JclTD32.pas),我不确定如何使用这些代码,也不确定那里的结构是否足够广泛,可以显示本地变量。我很确定它可以处理全局符号,但我非常不确定局部符号。定义了各种各样的常量,并且没有格式的文档,要理解它们的含义,我只能猜测。但是,这些常量及其名称必须来自somewhere.
  • Source I can find using TDS info不加载或处理本地符号。

如果这是正确的方法,那么这个问题就变成了‘有没有TDS/TD32文件格式的文档,有没有加载局部变量的代码样本?’

代码样本不是必需的,但可能非常有用,即使它非常小。

EN

回答 2

Stack Overflow用户

发布于 2015-11-04 09:51:51

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

代码语言:javascript
复制
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++类型:

代码语言:javascript
复制
int abc::def::Ghi::jkl(const std::string, int, const void*)

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

代码语言:javascript
复制
__ZN11MRasterFont21getRasterForCharacterEh

而不是:

代码语言:javascript
复制
MRasterFont::getRasterForCharacter(unsigned char)
票数 2
EN

Stack Overflow用户

发布于 2020-01-23 23:22:00

看一看http://download.xskernel.org/docs/file%20formats/omf/borland.txt开放架构手册。它是旧的,但也许你可以找到一些关于文件格式的相关信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29990745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档