繁体   English   中英

没有-g选项编译的代码调用堆栈(gcc编译器)

[英]call stack for code compiled without -g option (gcc compiler)

如何分析未使用-g GCC选项编译的核心转储(使用gdb)?

生成地图文件。 映射文件将告诉您每个函数的起始地址(作为从exe开头的偏移量,因此您需要知道其加载的基址)。 然后,您查看指令指针并查找它在地图文件中的位置。 这使您可以很好地了解给定函数中的位置。

然而,手动展开堆栈是一种黑色艺术,因为您不知道编译器执行了哪些优化。 当你大致知道你在代码中的位置时,你通常可以计算堆栈上应该是什么,并扫描内存以找到返回指针。 然而它非常复杂。 您有效地花了很多时间读取内存数据并查找看起来像内存地址的数字,然后检查它是否符合逻辑。 它是完全可行的,我,我相信很多其他人,已经做了很多次:)

使用ELF二进制文件,可以将调试符号分隔为单独的文件。 objcopy手册页引用:

  1. 正常链接可执行文件(使用-g标志)。 假设那被称为foo然后......
  2. 运行objcopy --only-keep-debug foo foo.dbg以创建包含调试信息的文件。
  3. 运行objcopy --strip-debug foo创建一个剥离的可执行文件。
  4. 运行objcopy --add -gnu-debuglink = foo.dbg foo,将调试信息的链接添加到剥离的可执行文件中。

这不应该是一个问题,您可以使用-g选项再次编译源代码并将gdb传递给核心和新编译的调试二进制文件,它应该没有任何问题。

顺便说一句您可以使用gcc中的以下命令生成一个地图文件

gcc -Wl,-Map = system.map file.c

上面的行应该生成map文件system.map,一旦生成了map文件你可以映射上面提到的地址,但我不确定你要如何映射共享库,这是非常困难的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM