如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
上个月,我在HYPERLINK"http://cplus.abang.com/od/cplus/a/threadpoolana1.htm"\t"_blank"《ThreadPool分析》一文中介绍了如何构建ThreadPool进行多线程编程,大家在进行多线程编程过程中,肯定会发现多线程调试比较困难。本系列中将详细的介绍两种方法来调试多线程程序:一种自然是使用GDB,另一种是使用gcc的内置函数打印程序调用的帧栈来调试程序。GDBgdb是Unix下用来调试C和C++程序的常用的调试器.它使你能在程序运行时观察程序的内部结构和内存的使用情况。但在多线程编程过程中很多程序问题出在启动阶段,而且很难使用gdb进行调试,我们可以采用手工插入以下辅助代码暂停程序运行do{intflag=1;while(ff)slleep(1);}while(0)用gdb附到暂停的进程上去,再在gdb中执行(gdb)setvarflag=0是程序继续执行,我们就可以开始对程序进行调试。在gdb中我们可以使用(gdb)infothreads来显示当前进程中执行的所有线程;通过(gdb)thread来切换当前线程到线程thnum;并通过setscheduller-lockingon来修改OS线程调度器的策略,指定只有当前线程才能运行,来锁定调度器。下一章HYPERLINK"http://cplus.abang.com/od/cplus/a/multhreaddebug2.htm"\t"_blank"《C++多线程编程调试技巧(二)》将向大家介绍如何使用gcc内置函数打印线程的函数栈,来调试程序由于程序中函数的调用是存储在内存栈中,本章通过介绍使用gcc的内置函数(见以下)来打印函数栈,来显示函数的调用的层次关系,来调试程序。__builtin_return_address():此函数返回当前函数或其调用函数的返回地址__builtin_frame_address():返回调用函数的帧地址void*stack[4];_stack[0]=__builtin_return_address(1);if(__builtin_frame_address(2)==static_cast(NULL)){_stack[1]=NULL;}else{_stack[1]=__builtin_return_address(2);if(__builtin_frame_address(3)==static_cast(NULL)){_stack[2]=NULL;}else{_stack[2]=__builtin_return_address(3);if(__builtin_frame_address(4)==static_cast(NULL)){_stack[3]=NULL;}else_stack[3]=__builtin_return_address(4);}}以上代码就是将函数调用栈每一帧的地址保存在stack数组中,再将地址打印出来,我们可以通过启动gdb,执行(gdb)listaddress。address标识stack数组中的值,就可以直到函数调用的层次关系,来调试程序,下一章HYPERLINK"http://cplus.abang.com/od/cplus/a/multhreaddebug3.htm"\t"_blank"《C++多线程编程调试技巧(三)》将介绍如何使用上述方法进行调试。