https://blog.csdn.net/u012719556/article/details/45315089?utm_source=blogxgwz2
Linux下可执行程序调试信息的分离及release程序的调试
https://www.cnblogs.com/keanuyaoo/p/3317957.html
GDB调试Release版ELF文件
https://www.cnblogs.com/np10/archive/2013/01/24/2875573.html
c++ 符号表分离———objcopy(调试信息挂载)
https://blog.csdn.net/cyteven/article/details/13015511
使用objdump objcopy查看与修改符号表
https://blog.csdn.net/foruok/article/details/21157467
为release版程序保留符号表方便调试
https://blog.csdn.net/elated/article/details/8995074
ABI(Application Binary Interface)
https://blog.csdn.net/tuhuolong/article/details/6131399
最近要发布release版本,直接运行时程序就挂掉了,于是乎就想gdb一下,结果发现只能看到堆栈,查了一些博文,将调试方法总结如下:
1、进入debug版本的目录,将debug版本中相应动态库或执行程序的符号表导出,命令如下
objcopy --only-keep-debug 动态库名或可执行程序名 导出的符号文件名
例:objcopy --only-keep-debug libDBCommon.so libDBCommon.so.debug
如果需要调个动态库,每个动态库都执行一次上面的步骤,导出的符号名当然不能一样啦
3、将符号文件copy到release版的目录下(网上也有说在debug时可以用命令指定)
4、进入release目录,在release版的动态库或执行文件中添加调试信息文件链接,命令如下
objcopy --add-gnu-debuglink=符号文件名 对应的动态库名
例:objcopy --add-gnu-debuglink=libDBCommon.so.debug libDBCommon.so
调试多个动态库时执行多次,注意这时候原本release的动态库大小会增大一些
5、确认调试信息文件链接,命令如下
objdump -s -j .gnu_debuglink 动态库名
例:objdump -s -j .gnu_debuglink libDBCommon.so
调试多个动态库时执行多次
6、启动调试
gdb -q --symbol=第一个符号文件名:第二个符号文件名:第三个符号文件名 --exec=可执行程序名
例:gdb -q --symbol=libDBCommon.so.debug:libDBNodeManager.so.debug:libcoremodule.so.debug --exec=scadaserver
符号文件名可以是多个(动态库或执行程序的),中间用冒号隔开
————————————————————————————————————————————————————————————————————————————————————————————————————————————————