gdb远程调试 - 当进入共享库时程序崩溃
我在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你好。
尝试使用调试标志编译共享库。
我用-g编译过它。我需要添加的其他东西? – 2011-02-17 16:26:51
我也看到过这样的情况,尽管它似乎对您的例子没有再现性(我再次没有交叉编译)。尽管如此,暗示处理这种情况...
- 首先当然,编译与
-O0 -ggdb3
(不只是-g)建议。 - 使用
LD_BIND_NOW=1 gdb hello
禁用这种惰性解析。 - 如果没有帮助,请在gdb中使用
b foo
,然后单步执行并/或像往常一样继续,并等待它在foo中停止。
虽然它不应该崩溃,但您必须使用-g标志进行编译才能进行合理的调试 - 这是否有所作为? – nos 2011-02-17 10:35:04
我用-g编译。忘了提及。 – 2011-02-17 10:53:25