0

我在 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 ?? ()

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

这是你好.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

4

2 回答 2

1

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

  • 首先,当然-O0 -ggdb3建议使用(不仅仅是-g)进行编译。
  • 用于LD_BIND_NOW=1 gdb hello禁用此类惰性解析。
  • 如果这没有帮助,请b foo在 gdb 中使用,然后单步执行和/或像往常一样继续并等待它在 foo 中停止。
于 2011-02-17T21:54:52.523 回答
0

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

于 2011-02-17T15:29:09.597 回答