linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > article > unix > unix提高 >
栏目导栏
资料搜索
热门文章
·20%的SOLARIS知识解决80%的问题
·Solaris启动过程详解 zt
·查看Solaris系统硬件配置的命令
·Unix系列shell程序编写(中)
·STRUTS 源码学习笔记
·SOLARIS技巧篇
·snort源码分析
·Unix系列shell程序编写(下)
·在solaris 10/x86下安装oracle
·solaris 10 硬盘安装
·Solaris安全配置手册
·Apache源代码分析——关于模块
·HP-UX基本指令快速参考
· Tomcat Server源码启动分析
·Solaris8 双网卡配置(路由器用
最新文章
·solaris系统安全配置
·RHEL5.0操作系统下NFS服务的配
·Solaris Linux 9下Vsftpd的配置
·在HP-UX下建立只归属于某个目录
·SolarWinds2002使用说明
·从外部存储划盘并加入vg,为fs扩
·因带库问题导致系统光纤卡报错
·Unix下多线程中条件变量的使用
·UNIX和Linux中信号的个数
·不同的类UNIX操作系统密码破解
·AIX系统下Domino邮件服务器安装
·限制ROOT用户远程登陆UNIX系统
·Unix操作系统入侵追踪反击战
·AIX CDE不能启动的故障一般性解
·CentOS4.4用VSFTPD架设FTP服务
Google
 
Solaris2.4 多线程编程指南6--编译和调试
[ 作者:Linux联盟收集  加入时间:2006-07-11 19:48:21  来自:Linux联盟收集 ]
6.编译和调试 SkYLinux联盟
SkYLinux联盟
本章描述了怎样编译和调试多线程程序。 SkYLinux联盟
编译一个多线程应用程序 SkYLinux联盟
调试一个多线程应用程序 SkYLinux联盟
SkYLinux联盟
6.1编译一个多线程应用程序 SkYLinux联盟
SkYLinux联盟
6.1.1使用C编译器 SkYLinux联盟
SkYLinux联盟
确认你拥有如下软件,否则将无法正常编译和连接多线程程序 SkYLinux联盟
· 头文件:thread.h errno.h SkYLinux联盟
· 标准C编译器 SkYLinux联盟
· 标准Solaris连接器 SkYLinux联盟
· 线程库(libthread) SkYLinux联盟
· MT-Safe库(libc, libm, libw, libintl, libmalloc, SkYLinux联盟
libmapmalloc, libnsl, 等等) SkYLinux联盟
SkYLinux联盟
6.1.2用替代(_REENTRANT)标志进行编译 SkYLinux联盟
SkYLinux联盟
在编译多线程程序时使用""-D _REENTRANT""标志。 SkYLinux联盟
这个标志必须在编译应用程序的每一个模块时都使用。如果没有这个标志,将使用errno, stdio等等的旧的定义。如果要编译一个单线程应用程序,不要使用这个标志。 SkYLinux联盟
SkYLinux联盟
*新旧连接需要小心 SkYLinux联盟
SkYLinux联盟
表6-1显示了多线程目标代码模块与旧的代码模块连接时需要非常慎重。 SkYLinux联盟
表6-1 在编译多线程程序时使用""-D _REENTRANT""标志 SkYLinux联盟
文件类型 编译 参考 返回 SkYLinux联盟
旧的目标文件(非线程版)和新的目标文件 没有 ""-D _REENTRANT"" 标志。 静态储存 传统的errno SkYLinux联盟
新的目标文件 有 ""-D _REENTRANT""标志。 __errno,新的二进制入口 线程定义errno的地址 SkYLinux联盟
用libnsl 里的TLI编程 有 ""-D _REENTRANT""标志(必须)。 __t_errno,一个新的入口 线程定义t_errno的地址 SkYLinux联盟
SkYLinux联盟
6.1.3使用libthread SkYLinux联盟
SkYLinux联盟
为了在连接时使用libthread,需要在ld命令行里,-lc参数之前,指定 -lthread,或者在cc 命令行的最后指定。 SkYLinux联盟
如果应用程序没有连接libthread,则对该库中的函数调用不产生实际操作。 SkYLinux联盟
Libc定义libthread为空过程。???真正的过程是在应用程序既连接libc也 连接libthread时由libthread加入的。 SkYLinux联盟
如果一个ld命令行包含了以下的字段:.o''s ... -lc -lthread ...,则C函数库的行为没有被定义。??? SkYLinux联盟
不要在单线程程序中使用-lthread。这样做将在连接时建立多线程机制,在运 行时将被初始化。这样做不但浪费资源,而且在调试中会对运行结果有不正确的显示。 SkYLinux联盟
SkYLinux联盟
6.1.4使用非C的编译器 SkYLinux联盟
SkYLinux联盟
线程库使用libc中的如下内容: SkYLinux联盟
· 系统调用包装器(system call wrappers) SkYLinux联盟
· 用来显示出错信息的调用(通常是printf) SkYLinux联盟
· 运行时的连接支持来解析符号(因为库是动态连接的) SkYLinux联盟
SkYLinux联盟
你也可以写自己的系统调用包装器和自己的printf函数,并且在连接时(而不 是在运行时)进行符号解析,这样可以消除对libc的依赖。 SkYLinux联盟
如果线程使用应用程序提供的堆栈,则线程库不使用动态分配内存的办法。 Thr_create(3T)函数可以由应用程序指定自己的堆栈。 SkYLinux联盟
SkYLinux联盟
6.2调试多线程应用程序 SkYLinux联盟
SkYLinux联盟
6.2.1一般的疏漏 SkYLinux联盟
以下列出可以导致多线程出错的常见疏漏: SkYLinux联盟
· 给新线程传递参数时使用局部或全局变量 SkYLinux联盟
· 在没有同步机制的保护下访问全局内存 SkYLinux联盟
· 两个线程以不同的顺序去申请两个资源导致死锁(两个线程各自占有一个资源并相执不下) SkYLinux联盟
· 在同步保护中有隐藏的漏洞。例如可能有如下情况:一个有同步机制(例如互斥 锁)保护的代码段包含一个先释放再重新获得同步机制的函数调用,结果是全局内存 实际上没有得到保护。 SkYLinux联盟
· 有隐匿的,重复或递归的大自动数组的使用可能导致问题,因为多线程程序的堆 栈容量比单线程程序有更多的限制。 SkYLinux联盟
· 指定的堆栈空间不够。 SkYLinux联盟
· 没有通过线程库的调用指定堆栈。 SkYLinux联盟
注意,多线程程序(特别是有错误的)经常在相同输入的情况下得到不同的结 果,因为线程调度的顺序不同。 SkYLinux联盟
一般的,多线程bug具有统计性,而不是确定性。在调试时,跟踪的办法将会比 设断点的办法好些。 SkYLinux联盟
SkYLinux联盟
6.2.2使用adb SkYLinux联盟
SkYLinux联盟
如果你在一个多线程程序当中绑定所有线程,一个线程和一个LWP是同步的。然 后你通过如下支持多线程编程的adb命令访问每一个线程。 SkYLinux联盟
SkYLinux联盟
表6-2 MT adb命令 SkYLinux联盟
------------------------------------- SkYLinux联盟
pid:A 绑定在进程pid上,这将停止进程及其所有LWP SkYLinux联盟
∶R 与进程分离,这将恢复进程及其所有LWP SkYLinux联盟
$L 显示在(停止的)进程中所有的活动的LWP SkYLinux联盟
n:l 将焦点切换到第n号LWP SkYLinux联盟
$l 显示当前焦点所在的LWP SkYLinux联盟
num:i 忽略信号码为num的信号 SkYLinux联盟
SkYLinux联盟
6.2.3使用dbx SkYLinux联盟
SkYLinux联盟
使用dbx,可以调试和执行用C++, ANSI C, FORTRAN和PASCAL的源程序。Dbx使用与SPARCworks? Debugger相同的命令,但使用标准终端(tty)接口。Dbx和 SkYLinux联盟
SPARCworks Debugger现在都支持多线程程序。 SkYLinux联盟
要得到dbx和Debugger的全面认识,请参考SunPro dbx(1) man page和 SkYLinux联盟
《Debugging a Program》用户指南。 SkYLinux联盟
以下的dbx选项支持多线程。 SkYLinux联盟
表6-3 给MT程序使用的dbx选项 SkYLinux联盟
Cont at line[sig signo id] 在信号signo发生时继续执行第line行。 SkYLinux联盟
参见dbx的命令语言的循环控制里的continue。 SkYLinux联盟
如果有id参数,则指定继续哪一个线程或LWP。 SkYLinux联盟
缺省设置为all。 SkYLinux联盟
Lwp 显示当前LWP。切换到给定LWP[lwpid] SkYLinux联盟
Lwps 列出当前进程的所有LWP SkYLinux联盟
Next … tid 单步执行指定线程。如果一个函数调用被跳过, SkYLinux联盟
所有的LWP在该函数调用期间重新开始???非 SkYLinux联盟
活动线程不能被单步执行 SkYLinux联盟
Next … lid 单步执行指定LWP。在跳过函数时并不隐含地恢 SkYLinux联盟
复所有的LWP。在该LWP上的线程是活动的。 SkYLinux联盟
Step … tid 单步执行指定线程。如果一个函数调用被跳过, SkYLinux联盟
所有的LWP在该函数调用期间重新开始???非 SkYLinux联盟
活动线程不能被单步执行 SkYLinux联盟
Step … lid 单步执行指定LWP。在跳过函数时并不隐含地恢 SkYLinux联盟
复所有的LWP。 SkYLinux联盟
Stepi … lid 指定的LWP SkYLinux联盟
Stepi … tid 在LWP上的线程是活动的。 SkYLinux联盟
Thread 显示当前线程。切换到线程tid。在以下情况中, SkYLinux联盟
一个可选的tid指当前线程。 SkYLinux联盟
Thread -info[tid] 打印指定线程的所有已知情况。 SkYLinux联盟
Thread -locks[tid] 打印被指定线程控制的所有锁 SkYLinux联盟
Thread -suspend[tid] 把指定线程置于挂起状态。 SkYLinux联盟
Thread -continue[tid] 使指定线程退出挂起状态。 SkYLinux联盟
Thread -hide[tid] 隐藏指定(或当前)线程,在普通线程列表中 SkYLinux联盟
将不被显示出来 SkYLinux联盟
Thread -unhide [tid] 解除指定线程的隐藏状态 SkYLinux联盟
Allthread-unhide 解除所有线程的隐藏状态 SkYLinux联盟
Threads 打印已知线程的列表 SkYLinux联盟
Threads-all 打印所有线程(包括通常不被打印的,zombies) SkYLinux联盟
All|filterthreads-mode 控制threads命令打印所有线程还是有选择地列表 SkYLinux联盟
Auto|manualthreads-mode 使在GUI界面里线程监控器(Thread Inspector) SkYLinux联盟
线程列表得以自动更新 SkYLinux联盟
Threads -mode 显示当前模式。Any of the previous forms SkYLinux联盟
can be followed by a SkYLinux联盟
thread or LWP ID to get the traceback for the specified entity. SkYLinux联盟
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·Solaris2.4 多线程编程指南5--安全和不安全的接口函数  (2006-07-11 19:47:46)
 ·Solaris2.4 多线程编程指南4--操作系统编程  (2006-07-11 19:47:09)
 ·Solaris2.4 多线程编程指南3--使用同步对象编程  (2006-07-11 19:46:25)
 ·Solaris2.4 多线程编程指南2--用多线程编程  (2006-07-11 19:44:46)
 ·Solaris2.4 多线程编程指南1--线程基础  (2006-07-11 19:44:05)
 ·Solaris 9 for x86 在VM下安装全攻略  (2006-07-11 19:41:17)
 ·solaris系统备份到HP DAT72磁带上  (2006-07-11 10:23:17)
 · xine安装指南  (2006-07-09 20:14:30)
 ·手把手教你编译安装MPlayer-1.0pre5  (2006-07-09 20:12:06)
 ·qmail在Linux,Solaris系统安装详解  (2006-07-09 00:28:09)