5

这是我时不时遇到的情况:

对于不使用虚拟寻址的嵌入式系统,我有一个从 C 或 C++ 代码编译的可执行文件,其中包含调试信息。它通常采用 COFF 或 ELF/DWARF(我把这两种混淆)格式。

在运行时,在 PC 上,我想确定给定名称的变量的地址。(例如“foo.bar[7].baz”)这允许我在嵌入式系统上读/写变量的值(给定一个超出此问题范围的调试协议)。显然,任何基于堆栈或基于堆的变量都不存在,因为它们没有静态地址。

我之前已经在 C++ 中完成了这项工作,以从 TI 的编译器为他们的 2800 系列 DSP 解析 COFF 文件,这有点痛苦。我想知道那里是否已经有一个 Java 库可以做这种事情,因为我面临着同样的事情与一个或两个其他处理器的可执行文件。


更新:(2009 年 11 月 18 日)一个有希望的线索!

有没有人使用过 Eclipse CDT ELF 解析器?

(参见http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.cdt.doc.isv/reference/api/org/eclipse/cdt/core/model/IBinary.html之一javadoc pgs 的)

TI 的 Code Composer 4(基于 Eclipse)似乎使用了这个,所以如果我能弄清楚文档在哪里,也许我可以用它来解决我的问题。

4

2 回答 2

2

gdb 是否支持您的目标 CPU?

如果是,那么实现调试协议并与目标通信的程序也可以实现GDB 远程串行协议并为 gdb 提供一个 TCP 套接字与之通信。

安排是这样的

gdb <--gdb 协议--> java-prog <--你的调试协议--> 目标

要运行整个事情,假设您的目标已经在运行您的程序

  1. 运行 java-prog
  2. 运行gdb your-executable并连接到 java-prog

    (gdb) 目标远程 127.0.0.1:端口

  3. 让 gdb 读取一个值

    (gdb) p foo.bar[7].baz

这被转换为通过 TCP 发送到 java-prog 的 gdb 数据包。java-prog 应该在 gdb 协议和您的自定义调试协议之间进行转换。

于 2009-04-03T17:19:49.953 回答
1

您可以为您的平台编译的GNU binutils构建一个 JNI 接口。但是,如果 GPL 与您的软件许可冲突,那么这将不是一个可行的解决方案。

于 2009-04-04T16:59:10.663 回答