在使用-g构建的共享库中的函数中使用gdb确定局部变量的值(gdb表示没有行号信息)

时间:2013-04-25 14:39:17

标签: gdb

列出项目1-4是我所做的步骤。 列表项5描述了该问题 清单第6项提供了其他信息

  1. 我编译了一个C源代码,用cg.c和.g标志。
  2. 我也有 动态共享库说liba1.so用-g为所有源构建 它拥有的文件。
  3. 我通过将c1.o(c1.c目标代码)与liba1.so链接来构建可执行文件说exe1。
  4. 我做gdb exe1。并且能够逐步完成c1.c的来源。当c1调用共享库时,我也能够在共享库中的函数上放置断点

  5. 但是,当我尝试单步执行该函数时,它会说“单步执行直到退出函数foo1,它没有行号信息”也应该通常显示传递的参数的值进入函数foo1但不这样做。这种情况发生在共享库中的所有函数中,包括一些非常大的函数,因此无法优化值

  6. 我在共享库和可执行文件上做了一个objdump -t - 它显示了符号表(我可以在函数上设置断点的事实也支持这个)。另外,我可以看到文件c1.c中使用的变量的值。那么我该怎么做才能确保我可以在共享库中看到局部变量的值。以下是用于编译共享库的其他参数“-O2 -std = gnu99 -Werror -fno-stack-protector -Wstack-protector --param ssp-buffer-size = 1 -g -nostdinc”。做信息f并试图查看框架上的内存地址也没有提供任何信息。

  7. 我正在寻找一些建议,至少要排除故障。如果共享库具有行号信息,我是否可以使用objdump(或任何其他实用程序)。

1 个答案:

答案 0 :(得分:0)

  

我正在寻找一些建议,至少要对其进行故障排除。

no line number information的最可能原因是实际上没有行号信息,最可能的原因是你有{{1}的两个副本 - 一个有调试信息,另一个没有调试信息,你在运行时加载后者。

第一步:liba1.so会告诉您完全哪个(gdb) info shared已加载。

如果它实际上是您刚刚使用liba1.so构建的版本,则应验证它是否具有您期望的调试信息。这样做的确切命令是特定于平台的(并且您没有告诉您所在的平台)。在ELF平台上,-gobjdump -g liba1.so应该有效。

readelf -w liba1.so代码没有调试信息的一个常见原因是链接行上存在-g(strip)标志;确保你的链接线上没有“迷路”标志。除了编译时,某些平台还需要在链接时使用-s