记一次segment err ,段错误的排除流程

 1.程序跑飞了,看代码具体到了那行,但是仍然不能确定问题,是snprintf出现的问题,这个时候,使用debug,期望通过debug 能够获取到有效信息,但是gdb到那行后,查看怀疑的空指针,并不是自己想象的错误!

因此换个思路,去查看崩溃时候的打印内存信息,此时发生rbp,rsp有些不正常,局部栈空间的地址是0x07b开始,堆里面的也是,感觉是栈出现了问题,一般认为栈都是0x7FFFF开始的,实际观察,发现是栈溢出 了,JOB刚启动的时候,已经给分配了600K的内存,但是目前用到的空间,局部变了900K导致栈溢出....

   验证这个问题,直接将栈里面的局部大内存变量直接通过malloc使用堆空间的,问题消失。

  排查出这个问题比较侥幸,需要细心查看rbp,rsp,栈大小,程序实际分配的栈的大小,大胆猜测,小心求证。

2.程序在本地目录写文件,如何快速查询到导致写入到了哪个目录里面??

通过find查找,发现效率很低,很多目录没有查询权限,因此想起了查看进程PID,然后通过cat /proc/PID/cmdline,查看到启动时候的命令,因此能查看到具体到哪个目录。

上面排查可以根据程序的具体特征,进程PID,/proc/PID 目录里面的比如进程有哪些描述符,进程启动命令等详细信息。

奋斗为了更好的生活。
原文地址:https://www.cnblogs.com/redman274/p/15359753.html