无法加载共享库符号,GDB

时间:2013-03-06 05:03:07

标签: debugging gdb shared-libraries mex

我从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

可以看出,我对-g.o个文件使用.so标记

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

正如我所看到的,您正在使用QSP.so的相对路径。

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

例如QSP.so位于/home/user/project/QSP.so

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

答案 2 :(得分:0)

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

您需要一个指向共享库的.gdbinit文件。我正在使用Eclipse,我只是将用那一行编写的.gdbinit赋予“附加到进程”配置以调试c ++程序。假设.gdbinit文件位于eclipse项目的根目录中,该项目在共享库所在的Debug文件夹中,则行应为

set solib-search-path ./Debug/