2011-02-17 74 views
0

我在cygwin主机上交叉编译了一个linux目标应用程序。该程序可以在目标上运行,也可以在gdbserver上运行。但是,当我尝试逐步浏览程序时,每次进入共享库函数时都会崩溃。回溯GDB打印是: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的未知-Linux的GNU的gcc的-g -c hello.c的编译。

和foo.c的:

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

x86_64的未知-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你好

+0

虽然它不应该崩溃,但您必须使用-g标志进行编译才能进行合理的调试 - 这是否有所作为? – nos 2011-02-17 10:35:04

+0

我用-g编译。忘了提及。 – 2011-02-17 10:53:25

回答

0

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

+0

我用-g编译过它。我需要添加的其他东西? – 2011-02-17 16:26:51

1

我也看到过这样的情况,尽管它似乎对您的例子没有再现性(我再次没有交叉编译)。尽管如此,暗示处理这种情况...

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