当前位置: 技术问答>linux和unix
郁闷!Linux下多线程的bug定位
来源: 互联网 发布时间:2015-05-29
本文导语: 我刚学Linux编程,调试一个网络服务程序。大批量服务请求时,程序异常退出。可用的错误定位方法只有log文件。对多线程来说,每一个未完的线程,都可能出错,根本不能定位。我搞了3天,没调出来,郁闷! 请教...
我刚学Linux编程,调试一个网络服务程序。大批量服务请求时,程序异常退出。可用的错误定位方法只有log文件。对多线程来说,每一个未完的线程,都可能出错,根本不能定位。我搞了3天,没调出来,郁闷!
请教:有无类似VC下查调用堆栈,或由map文件定位出错函数的方法,定位错误。请各位大哥多指点,各抒己见。
言者有分。不够再加。
请教:有无类似VC下查调用堆栈,或由map文件定位出错函数的方法,定位错误。请各位大哥多指点,各抒己见。
言者有分。不够再加。
|
编译时加入-g调试选项,去掉-Ox选项
使用gdb运行,如果中断退出,使用bt命令查看调用堆栈,如果不是可以
通过thr n (n表示线程号,用 info thr查看)切换,然后bt看堆栈
以上方法在kernel 2.6+gdb 6中有问题
使用gdb运行,如果中断退出,使用bt命令查看调用堆栈,如果不是可以
通过thr n (n表示线程号,用 info thr查看)切换,然后bt看堆栈
以上方法在kernel 2.6+gdb 6中有问题
|
检查一切
memcpy, strcpy, strcat sprintf 动态数组下标。
这种问题多半世内存访问错误或者缓冲区溢出覆盖堆栈造成的。
调试方法:
gdb 调试程序或者gdb调试core文件
memcpy, strcpy, strcat sprintf 动态数组下标。
这种问题多半世内存访问错误或者缓冲区溢出覆盖堆栈造成的。
调试方法:
gdb 调试程序或者gdb调试core文件
|
没有core文件吗?用gdb看一下就可以知道在哪里中断的了
|
errno在linux好像是多线程安全的,无需自己写
|
最本的办法,就是各个线程都写各自的文件,不停的血,把运行中变量的变化都写上,赫赫。。。还挺管用。。。
|
我也是才开始学习Linux编程,你可以在响应连接请求的地方用gdb设一个断点看一下,可能是堆栈溢出。
一点建议,大家努力
一点建议,大家努力
|
不可能的八,有log文件已经很幸福了阿
不过要保证你的产生log文件的函数是线程安全的
不过要保证你的产生log文件的函数是线程安全的
|
网络服务用线程作???
一个很常见的问题是没有把pthread给detach掉~~~
据我所知,一般网络程序都用进程作的,线程光一个同步就搞死你~~
一个很常见的问题是没有把pthread给detach掉~~~
据我所知,一般网络程序都用进程作的,线程光一个同步就搞死你~~
|
你应该为每一个线程都定义单独的errorno。
用gdb调试。
用gdb调试。
|
如果是内存的问题,相对好办一点,用工具分析,实在不行自己写个pool监视---不过还是工具的好
|
线程同步问题最麻烦的说
以前做异步IO作服务器的时候真是心力憔悴阿 我是看log看出来得
以前做异步IO作服务器的时候真是心力憔悴阿 我是看log看出来得
|
gz