我从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
标记
任何帮助都表示赞赏,并提前致谢。
答案 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
:
cd /home/user/project/
gdb <app>
答案 2 :(得分:0)
如果其他人有这个问题,答案与this question中给出的答案相同。
您需要一个指向共享库的.gdbinit文件。我正在使用Eclipse,我只是将用那一行编写的.gdbinit赋予“附加到进程”配置以调试c ++程序。假设.gdbinit文件位于eclipse项目的根目录中,该项目在共享库所在的Debug文件夹中,则行应为
set solib-search-path ./Debug/