1

我正在QSP.so从 MATLAB 调用一个共享库 ( )。该库是用 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

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

4

3 回答 3

3

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

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

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

于 2013-03-06T06:06:52.213 回答
1

如果其他人有此问题,答案与此问题中给出的相同。

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

set solib-search-path ./Debug/
于 2019-07-02T10:55:11.890 回答
0

如我所见,您正在使用相对路径QSP.so

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

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

  1. cd /home/user/project/
  2. gdb <app>
于 2018-02-06T07:11:36.130 回答