无调试符号的corefile无法调试,是否有工具可为其重新添加符号信息?
问题答案
核心结论
不需要直接将符号信息写入无符号corefile,Linux平台的主流调试工具原生支持匹配对应版本的带符号可执行文件配合无符号corefile完成调试,唯一要求是带符号二进制与生成core的生产无符号二进制,必须来自同版本代码、完全一致的编译配置,仅差异为是否strip移除符号。
常规调试操作步骤
- 用和生产环境完全一致的编译配置编译同版本源代码,编译完成后不要执行
strip操作,保留完整符号表得到带符号可执行文件(若生产二进制是编译完成后额外执行strip得到,直接提取编译产出的未strip原始二进制即可,无需修改原有编译配置)。 - 使用gdb加载时同时传入带符号二进制和corefile,命令为:
gdb 带符号可执行文件路径 corefile路径 - 加载完成后即可正常执行
bt打印调用栈、info threads查看线程列表等常规调试操作。
源码级调试优化
如果需要支持查看源码、变量值等更精细的调试能力,可以在本地编译时额外添加-g编译参数生成带调试信息的二进制,只要代码版本、其他编译参数和生产完全一致,同样可以正常匹配生产环境生成的corefile。
符号嵌入corefile方案
如果确实需要将符号写入corefile(如需将core转给第三方调试、不便单独附带符号文件),可以使用elfutils工具集中的eu-unstrip工具完成操作,命令格式为:
eu-unstrip 生产无符号二进制路径 本地带符号二进制路径 原始corefile路径 -o 输出带符号corefile路径
执行后得到的新corefile已嵌入符号信息,可单独加载调试。
内容的提问来源于stack exchange,提问作者Tinyden
相关产品推荐
相关产品推荐

