【问题标题】:Could not Load Shared Library Symbols, GDB无法加载共享库符号,GDB
【发布时间】:2013-03-06 05:03:07
【问题描述】:

我正在从 MATLAB 调用一个共享库 (QSP.so)。该库是用 C 语言编写的,并使用 mex 网关,数据通过共享库传递。我的 C 代码中似乎存在一些错误,因为我有以下问题:

1) 在 MATLAB 中,当我调用网关函数时,MATLAB 大部分时间都会冻结。 2)当我使用GDB调试代码时,如Here所述,并在入口函数(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 标志

任何帮助表示赞赏并提前致谢。

【问题讨论】:

    标签: debugging gdb shared-libraries mex


    【解决方案1】:

    我认为答案在错误信息中,

    Do you need "set solib-search-path" or "set sysroot"?
    

    也许在你家的 .gdbinit 中存储一个适当的设置,看看你是否可以帮助 gdb 找到符号表。

    【讨论】:

    • 为什么要告诉gdb共享库的位置? Gdb 可以简单地查看 /proc/PID/maps 文件以找出答案——假设它尚未捕获 dlopen() 调用。
    【解决方案2】:

    如果其他人有这个问题,答案与this question中给出的相同。

    您需要一个指向您的共享库的 .gdbinit 文件。我正在使用 Eclipse,我只是将我用这一行制作的 .gdbinit 提供给“附加到进程”配置以调试 c++ 程序。假设 .gdbinit 文件位于 Eclipse 项目的根目录中,该项目有一个共享库所在的 Debug 文件夹,则该行将是

    set solib-search-path ./Debug/
    

    【讨论】:

      【解决方案3】:

      如我所见,您使用的是QSP.so 的相对路径。

      尝试将目录更改为QSP.so 所在的路径。

      例如QSP.so/home/user/project/QSP.so中:

      1. cd /home/user/project/
      2. gdb <app>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-28
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多