今天调试的时候遇到个很奇怪的问题,我的服务是多进程的,每次收到请求子进程就退出了,然后又重新被父进程拉起一个新的子进程,看了下core目录也没有生成core文件。
- 通过日志看到当前执行到了哪里,在后面调用和return位置加打印TODO,再次调试,发现是在调用一个函数的时候直接退出了,并且都没有进入到函数里面去。
- 通过ps -ef查看子进程的pid,然后gdb -p到子进程上,打断点,再次调试
(gdb) b xxx.cpp:26
No source file named xxx.cpp.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (xxx.cpp:26) pending.
(gdb) c
Continuing.
[Inferior 1 (process 6008) exited with code 0177]
(gdb) quit
0177代表引用了未定义的符号,我们进一步确认一下
- 在makefile里面加上-Wl,-z -Wl,defs选项再进行编译,编译报错undefined reference to,提到了我们调用的函数
- 我们也可以使用ldd -r来查看undefined symbol,也提到了我们调用的函数
最后发现问题是,自己引用了一个新的so的接口,没有加上-l链接。一个是刚好这个模块是第一次引用这个so,makefile里面没有链接,一个是刚好这个模块的makefile编译选项没有强制在存在任何未定义符号的情况下生成致命错误。