【问题标题】:Debugging shared library with gdb使用 gdb 调试共享库
【发布时间】:2014-04-03 05:51:03
【问题描述】:

我写了一个相当大的程序,我收到了共享库 test.so 来测试它。启动它后,通过了很多测试,但在某个地方它被卡住了。它不断显示错误消息:“ERR 65”,可能由 test.so 提供,而不是由 gdb 提供。 当我尝试在某处放置断点时,总是有太多的代码要经过,以至于我无法达到制造麻烦的功能。

当我点击 ctrl+c 停止它时,我得到了一个写入步骤:

_IO_new_file_write (f=0x2aaaab7b7280 <_IO_2_1_stdout_>, data=<optimized out>, n=17) at     
fileops.c:1263
1263    fileops.c: No such file or directory.

它什么也没给我 当我写回溯时,我得到了类似的东西:

#0  0x00002aaaab4e1700 in __write_nocancel () at ../sysdeps/unix/syscall-template.S:81
#1  0x00002aaaab46f243 in _IO_new_file_write (f=0x2aaaab7b7280 <_IO_2_1_stdout_>, data=        
<optimized out>, n=17) at fileops.c:1262
#2  0x00002aaaab46f122 in new_do_write (fp=0x2aaaab7b7280 <_IO_2_1_stdout_>,         
data=0x2aaaaaad2000 "ERR 65: Za duzo.\n+ 15 elementow.\n elementow.\n\nin.\n", 
to_do=17) at fileops.c:538
#3  0x00002aaaab470855 in _IO_new_do_write (fp=<optimized out>, data=<optimized out>,         
to_do=17) at fileops.c:511
#4  0x00002aaaab46fac1 in _IO_new_file_xsputn (n=5, data=<optimized out>,     
f=0x2aaaab7b7280 <_IO_2_1_stdout_>) at fileops.c:1333
#5  _IO_new_file_xsputn (f=0x2aaaab7b7280 <_IO_2_1_stdout_>, data=<optimized out>, n=5)     
at fileops.c:1278
#6  0x00002aaaab464e15 in __GI__IO_fwrite (buf=<optimized out>, size=1, count=5,     
fp=0x2aaaab7b7280 <_IO_2_1_stdout_>) at iofwrite.c:43
#7  0x00002aaaaaf6fb45 in std::basic_ostream<char, std::char_traits<char> >&     
std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char,     
std::char_traits<char> >&, char const*, long) () from /usr/lib/x86_64-linux-    
gnu/libstdc++.so.6
#8  0x00002aaaaaf6fe07 in std::basic_ostream<char, std::char_traits<char> >&     
std::operator<< <std::char_traits<char> >(std::basic_ostream<char,     
std::char_traits<char> >&, char const*) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#9  0x00002aaaaacd73e7 in Test2() () from ./tests/ltest_liniowe2.so
#10 0x0000000000404eb6 in main ()

这也没有给我任何东西。

下一个解决方案是在所有函数上设置断点并将输出写入文件,这样我就有程序流程,但我不知道如何自动化 gdb 问题,以便它自己编写“继续”函数以便转到下一个函数。

如何找到麻烦制造者功能?

非常感谢您的任何建议!

【问题讨论】:

    标签: c++ gdb


    【解决方案1】:

    你的问题是你没有用调试信息编译你的 test.so。

    在您的回溯中,帧 0-8 均来自 libstdc++ 或 libc。第 9 帧是来自您的程序的第一帧——但由于它没有调试信息,即使您进入该帧,也不会发现任何有趣的内容。

    修复方法是使用 -g 重新编译。

    【讨论】:

      猜你喜欢
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 2010-10-16
      • 2020-04-28
      • 2012-01-26
      • 1970-01-01
      相关资源
      最近更新 更多