【问题标题】:gdb remote debugging - program crashes when stepping into a shared librarygdb 远程调试 - 进入共享库时程序崩溃
【发布时间】:2011-06-29 00:03:41
【问题描述】:

我在 cygwin 主机上交叉编译了一个针对 linux 的应用程序。该程序在目标和 gdbserver 上运行正常。但是,当我尝试单步执行程序时,只要我单步执行共享库函数,它就会崩溃。回溯 gdb 打印的是:

(gdb) bt
#0 0x00000000004008f4 in ?? ()
#1 0x0000003f0380d7e4 in ?? ()
#2 0x00002b1373630000 in ?? ()
#3 0x00002b1373630590 in ?? ()
#4 0x00002b1373631348 in ?? ()
#5 0x00002b1373631888 in ?? ()
#6 0x0000003f03a1c510 in ?? ()
#7 0x0000000000000000 in ?? ()

如果我在函数上设置断点并继续它不会崩溃。

这是hello.c:

void foo(int*);
int main()
{
    int a;
    foo(&a);
    return a;
}

使用 x86_64-unknown-linux-gnu-gcc -g -c hello.c 编译。

和 foo.c:

void foo(int *i)
{
    *i = 2;
}

使用 x86_64-unknown-linux-gnu-gcc -g -shared -Wl,-soname,libfoo.so -o libfoo.so foo.c 编译

链接是用 x86_64-unknown-linux-gnu-gcc -Wl,-rpath,。 libfoo.so hello.o -o hello.

【问题讨论】:

  • 虽然它不应该崩溃,但您必须使用 -g 标志进行编译才能进行合理的调试 - 这有什么不同吗?
  • 我用-g编译。忘了说。

标签: c gdb shared-libraries remote-debugging gdbserver


【解决方案1】:

我也看到过这种情况,尽管您的示例似乎无法重现(再说一次,我没有交叉编译)。然而,处理这种情况的提示......

  • 首先当然建议使用-O0 -ggdb3(不仅仅是-g)进行编译。
  • 使用LD_BIND_NOW=1 gdb hello 禁用这种惰性解析。
  • 如果这样做没有帮助,请在 gdb 中使用 b foo,然后单步执行和/或照常继续,并等待它在 foo 中停止。

【讨论】:

  • 谢谢,但这些都没有帮助(除了使用 'b foo' 然后继续它总是有效的)
【解决方案2】:

尝试使用调试标志编译共享库。

【讨论】:

  • 我确实是用 -g 编译的。还有什么需要补充的吗?
  • 不,我的意思是:使用 -gdb 选项将共享库与您的 exec 链接。另外,共享库也应该使用 -ggdb 进行编译。所以你会拥有 libfoodb.so|您必须下载该库的 dbg 版本。或者自己编译 gcc -shared -ggdb
  • 谢谢,但没有帮助。结果相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
相关资源
最近更新 更多