我正在尝试调试一个使用 GDB 从多个共享库构建的应用程序。
gdb 的开始:
prompt$ gdb
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-50.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
告诉 GDB 程序要调试:
(gdb) file /home/me/build-path/my-program
Reading symbols from /home/me/build-path/my-program...done.
在应用程序中设置断点:
(gdb) my-program-src.cpp:57
breakpoint 1 at 0x819df9b: file src/my-program-src.cpp, line 57
运行程序:
(gdb) run
Starting program: /home/me/build-path/my-program
程序在断点处停止,正如预期的那样:
Breakpoint 1 MyClass:func(this-0xffffc1c0) at src/my-program-src.cpp:235
第 235 行my-program-src.cpp
是一个构造函数调用,class Derived
在MySharedLib1.so
.
'class Derived' 派生自 'class Base',它位于MySharedLib2.so
如果我现在迈出一步,程序会在 `MySharedLib2.so' 中退出,并带有一个 SIG SEGV(这是我要调试的),即:
Program received signal SIGSEGV, Segmentation fault.
0x0024c2fa in osal::MsgQMsg::id(unsigned int) () from /home/me/build-path/lib/libMySharedLib2.so
GDB 没有进入任何一个共享库。
bt
给出发生问题的函数的名称,但list
显示代码my-program-src.cpp
所有代码都使用以下选项编译:
gcc -MD -D__LINUX__ -g -Wall -Wextra -Iinc -m32 -fpic -I../../public_inc /home/me/src/file.c -o /home/me/build-path/obj/file.o
共享库与以下选项链接:
gcc -o /home/me/build-path/lib/libMySharedLib1.so -shared /home/me/build-path/obj/file.o -L/home/me/build-path/lib/ -m32
如果我更改 Makefile 以便构建档案库(即.a
),我可以按预期进入功能。
更多信息:
如果我手动尝试从共享库中添加符号,我会得到以下信息:
(gdb) add-symbol-file /home/me/build-path/lib/libMySharedLib2.so
The address where /home/me/build-path/lib/libMySharedLib2.so has been loaded is missing
add-symbol-file
(注意:一旦断点被击中,我会得到相同的响应)
如果我可以在共享库中的函数中设置断点,GDB 会按预期中断,但如果我键入list
GDB,则会在主应用程序代码中显示调用行(即不在共享库中的调用函数)。GDB 不会抱怨找不到源文件。
为什么我不能进入我的共享库?
为什么我不能单步执行共享库中的代码?