Debugging 无法加载共享库符号,GDB
我正在从MATLAB调用一个共享库(Debugging 无法加载共享库符号,GDB,debugging,gdb,shared-libraries,mex,Debugging,Gdb,Shared Libraries,Mex,我正在从MATLAB调用一个共享库(QSP.so)。该库是用C编写的,使用mex网关,数据被传递到共享库。我的C代码中似乎有一些bug,因为我有以下问题: 1) 在MATLAB中,当我调用gateway函数时,MATLAB大部分时间都冻结了。 2) 如前所述,当我使用GDB调试代码并在entry函数(QSP)处设置断点时,GDB不会在断点处停止并创建以下错误: warning: Could not load shared library symbols for ./QSP.so. Do you
QSP.so
)。该库是用C编写的,使用mex网关,数据被传递到共享库。我的C代码中似乎有一些bug,因为我有以下问题:
1) 在MATLAB中,当我调用gateway函数时,MATLAB大部分时间都冻结了。
2) 如前所述,当我使用GDB调试代码并在entry函数(QSP
)处设置断点时,GDB不会在断点处停止并创建以下错误:
warning: Could not load shared library symbols for ./QSP.so.
Do you need "set solib-search-path" or "set sysroot"?
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb289db40 (LWP 4234)]
0xb72a7a0e in ?? () from /lib/i386-linux-gnu/libc.so.6
我很确定网关没有问题,因为当我不调用共享库时,一切都很好。另一方面,如果没有任何调试器,则很难找到问题。所以,我想知道如何让GDB在断点处停止
另外,下面是我的Makefile:
CC = gcc
CFLAGS = -c -fpic -Wall -Werror -O3 -g
all: QSP.o ExtraRoutines.o
$(CC) -shared -o QSP.so -g $^
QSP.o: QSP.c ExtraRoutines.c QSP.h
$(CC) $(CFLAGS) $^
ExtraRoutines.o: ExtraRoutines.c QSP.h
$(CC) $(CFLAGS) $^
Moving:
mv -f QSP.so ../
Clean:
rm *.o
可以看出,我对.o
和.so
文件都使用了-g
标志
感谢您的帮助。我想答案就在错误信息中
Do you need "set solib-search-path" or "set sysroot"?
也许在你家里藏一个合适的设置。gdbinit看看你是否能帮助gdb找到符号表。我想答案在错误消息中
Do you need "set solib-search-path" or "set sysroot"?
可能在您的家中隐藏一个适当的设置。gdbinit以查看您是否可以帮助gdb找到符号表。正如我所看到的,您正在使用相对路径作为
QSP。因此
尝试将目录更改为QSP.so所在的路径
例如QSP.so
在/home/user/project/QSP.so
中:
cd/home/user/project/
gdb
如我所见,您正在为QSP.so使用相对路径
尝试将目录更改为QSP.so所在的路径
例如QSP.so
在/home/user/project/QSP.so
中:
cd/home/user/project/
gdb
如果其他人有此问题,答案与中给出的相同
您需要一个指向共享库的.gdbinit文件。我使用Eclipse,我简单地给出了用一行来定义的GdBiNIT到“附加到进程”配置来调试C++程序。假设.gdbinit文件位于eclipse项目的根目录中,该项目的共享库所在的调试文件夹中,则该行将为
set solib-search-path ./Debug/
如果其他人有此问题,答案与中给出的相同
您需要一个指向共享库的.gdbinit文件。我使用Eclipse,我简单地给出了用一行来定义的GdBiNIT到“附加到进程”配置来调试C++程序。假设.gdbinit文件位于eclipse项目的根目录中,该项目的共享库所在的调试文件夹中,则该行将为
set solib-search-path ./Debug/
为什么需要告诉gdb共享库的位置?Gdb只需查看/proc/PID/maps文件即可发现——假设它还没有捕获dlopen()调用?Gdb只需查看/proc/PID/maps文件即可找到答案——假设它尚未捕获dlopen()调用。