这是我偶尔遇到的情况:
对于不使用虚拟寻址的嵌入式系统,我有一个可执行文件,它是用C或C ++代码编译的,包含调试信息。它通常在COFF或ELF / DWARF(我得到那两个混合)格式。
在运行时,在PC上,我想确定给定名称的变量的地址。 (例如“foo.bar [7] .baz”)这允许我在嵌入式系统上读/写变量的值(给定一个超出本问题范围的调试协议)。显然,任何基于堆栈或基于堆的变量都没有,因为它们没有静态地址。
我之前在C ++中已经完成了这项工作,用于解析TI编译器为其2800系列DSP编写的COFF文件,这有点痛苦。我想知道是否有一个Java库已经做了这样的事情,因为我面对着一个或两个其他处理器的可执行文件同样的事情。
更新:(11/18/2009)一个很有希望的线索!
有没有人使用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)似乎使用了这个,所以看起来我可以找出文档的位置,也许我可以用它来解决我的问题。
答案 0 :(得分:2)
gdb是否支持您的目标CPU?
如果是,那么实现调试协议并与目标进行通信的程序也可以实现GDB Remote Serial Protocol并为gdb提供TCP套接字以进行通信。
这种安排就是这样的
gdb< - gdb protocol - > java-prog< - 您的调试协议 - >目标
要运行整个事情,假设您的目标已在运行程序
运行gdb your-executable
并连接到java-prog
(gdb)目标远程127.0.0.1:port
要求gdb读取值
(gdb)p foo.bar [7] .baz
这被转换为gdb数据包,通过TCP发送到java-prog。 java-prog应该在gdb协议和自定义调试协议之间进行转换。
答案 1 :(得分:1)
您可以为为您的平台编译的GNU binutils构建一个JNI接口。但是,如果GPL与您的软件许可证冲突,那么这将不是一个可行的解决方案。