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

Onk*_*jan 3 c c++ linux gcc gdb

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

Goz*_*Goz 6

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

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