Debugging 无法加载共享库符号,GDB

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

我正在从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 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()调用。