列出项目1-4是我所做的步骤。 列表项5描述了该问题 清单第6项提供了其他信息
我做gdb exe1。并且能够逐步完成c1.c的来源。当c1调用共享库时,我也能够在共享库中的函数上放置断点。
但是,当我尝试单步执行该函数时,它会说“单步执行直到退出函数foo1,它没有行号信息”也应该通常显示传递的参数的值进入函数foo1但不这样做。这种情况发生在共享库中的所有函数中,包括一些非常大的函数,因此无法优化值
我在共享库和可执行文件上做了一个objdump -t - 它显示了符号表(我可以在函数上设置断点的事实也支持这个)。另外,我可以看到文件c1.c中使用的变量的值。那么我该怎么做才能确保我可以在共享库中看到局部变量的值。以下是用于编译共享库的其他参数“-O2 -std = gnu99 -Werror -fno-stack-protector -Wstack-protector --param ssp-buffer-size = 1 -g -nostdinc”。做信息f并试图查看框架上的内存地址也没有提供任何信息。
我正在寻找一些建议,至少要排除故障。如果共享库具有行号信息,我是否可以使用objdump(或任何其他实用程序)。
答案 0 :(得分:0)
我正在寻找一些建议,至少要对其进行故障排除。
no line number information
的最可能原因是实际上没有行号信息,最可能的原因是你有{{1}的两个副本 - 一个有调试信息,另一个没有调试信息,你在运行时加载后者。
第一步:liba1.so
会告诉您完全哪个(gdb) info shared
已加载。
如果它实际上是您刚刚使用liba1.so
构建的版本,则应验证它是否具有您期望的调试信息。这样做的确切命令是特定于平台的(并且您没有告诉您所在的平台)。在ELF平台上,-g
或objdump -g liba1.so
应该有效。
readelf -w liba1.so
代码没有调试信息的一个常见原因是链接行上存在-g
(strip)标志;确保你的链接线上没有“迷路”标志。除了编译时,某些平台还需要在链接时使用-s
。