能效coredump问题
更新时间: 2026/02/09
在Gitcode上查看源码

背景

在开发某些功能的过程中,会使用到C语言进行开发,可能出现异常复位问题,现根据问题出现的原因给出定位思路与方法

1. 配置

获取gdb.rar文件,并将其拷贝到/data目录下; 在对应环境telnet窗口执行source /etc/profile; 建立libreadline.so.8库的软链接到/usr/lib64目录,ln -s /data/libreadline.so.8 /usr/lib64/libreadline.so.8;

2. 定位

问题必现的情况下,且知道在具体某个组件下的哪一个C文件代码后,具体步骤如下:

  • 通过bmcgo build编译出对应的.so文件;
  • 将上述.so文件通过scp上传至环境 scp 上述文件地址 账户名@环境ip:/tmp 随后根据提示,键入密码;
  • 在环境上通过find -name xxx.so找到文件所在目录,并用上述上传至/tmp下的文件替换;
  • 通过ps aux | grep 组件名,查看进程号
  • 确认进程号后,到上传的gdb目录下,通过attach连接,./gdb attach -p 进程号
  • 随后进行复现的操作,并观察gdb的执行结果(需要按'c'进行继续步骤),必现后会打印对应的堆栈信息,这里显示不能访问该地址,排查代码后发现,在使用fopen_s函数时,传入mode的值写的是单引号 FILE *fp = fopen_s(file_path, 'wb', file_path); // 打开文件,如果文件存在则覆盖

在C语言中,需要使用双引号!!!!此时问题已定位。

3. 总结

  • 上述为简单的coredump定位方法,因为问题是必现,很好定位,简单的coredump定位可参考上述方法;
  • C语言,写双引号!