多线程怎么调试(100)?

dukang_2005 2007-04-11 05:51:37
在linux下C/C++多线程怎么调试(100)?大家说说自己的经验给我们菜鸟听听!

还有一些深层次的问题:
线程同步互斥用到的 信号量 本质是软中断
事件 是信号量的变种
那么互斥体mutex是怎么实现的?实现原理是什么?
PV操作呢?
临界区呢?


...全文
3177 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolfishbone_joey 2011-08-29
  • 打赏
  • 举报
回复
转了。看来方法还挺多的。
swift19221 2010-08-13
  • 打赏
  • 举报
回复
好,学习一下,
gdb很强大的调试工具
socrazylee 2008-12-25
  • 打赏
  • 举报
回复
好文。。。。。。。
iu_81 2007-04-12
  • 打赏
  • 举报
回复
打开linux调试宏开关生成core文件
1./etc/profile
ulimit -S -c 0
改为:
ulimit -c unlimited
2./etc/init.d/functions
ulimit -S -c 0
改为:
ulimit -c unlimited
打开后如出错既会出现Segmentation fault (core dumped)
这时可 打开gdb调试
gdb ./am ./core.3426
以下调试方法与VC基本一致
Wolf0403 2007-04-12
  • 打赏
  • 举报
回复
多线程特定的错误多数由于缺乏对共享数据的保护,竞争状态的出现;而竞争状态的出现是具有偶然性的,取决于特定的调度次序;当设置断点时实际是将调度器的权限由系统交给调试者。这样在调试环境重现的,可能并不是出现 bug 时的情况。
真正可用的,还是 log 和 core dump 吧—— dore dump 反应的还是当时的真时状况
shunan 2007-04-12
  • 打赏
  • 举报
回复
对于:同步互斥,信号量,PV操作,临界区
如果知道了用高级语言如何实现的,不也就知道了汇编了吗,原理是一样的。
cplusplus2007 2007-04-12
  • 打赏
  • 举报
回复
断点
pottichu 2007-04-12
  • 打赏
  • 举报
回复
不过,我还是觉得通过自己打印日志的方法比较方便调试.
pottichu 2007-04-12
  • 打赏
  • 举报
回复
线程有自己的寄存器,运行时堆栈或许还会有私有内存。
gdb提供了以下供调试多线程的进程的功能:
* 自动通告新线程。
* \"thread THREADNO\",一个用来在线程之间切换的命令。
* \"info threads\",一个用来查询现存线程的命令。
* \"thread apply [THREADNO] [ALL] ARGS\",一个用来向线程提供命令的命令。
* 线程有关的断点设置。
注意:这些特性不是在所有gdb版本都能使用,归根结底要看操作系统是否支持。
如果你的gdb不支持这些命令,会显示出错信息:
(gdb) info threads
(gdb) thread 1
Thread ID 1 not known. Use the \"info threads\" command to
see the IDs of currently known threads.
gdb的线程级调试功能允许你观察你程序运行中所有的线程,但无论什么时候
gdb控制,总有一个“当前”线程。调试命令对“当前”进程起作用。
一旦gdb发现了你程序中的一个新的线程,它会自动显示有关此线程的系统信
息。比如:
[New process 35 thread 27]
不过格式和操作系统有关。
为了调试的目的,gdb自己设置线程号。
`info threads\"
显示进程中所有的线程的概要信息。gdb按顺序显示:
1.线程号(gdb设置)
2.目标系统的线程标识。
3.此线程的当前堆栈。
一前面打\"*\"的线程表示是当前线程。
例如:
(gdb) info threads
3 process 35 thread 27 0x34e5 in sigpause ()
2 process 35 thread 23 0x34e5 in sigpause ()
* 1 process 35 thread 13 main (argc=1, argv=0x7ffffff8)
at threadtest.c:68
`thread THREADNO\"
把线程号为THREADNO的线程设为当前线程。命令行参数THREADNO是gdb内定的
线程号。你可以用\"info threads\"命令来查看gdb内设置的线程号。gdb显示该线程
的系统定义的标识号和线程对应的堆栈。比如:

(gdb) thread 2
[Switching to process 35 thread 23]
0x34e5 in sigpause ()
\"Switching后的内容取决于你的操作系统对线程标识的定义。

`thread apply [THREADNO] [ALL] ARGS\"
此命令让你对一个以上的线程发出相同的命令\"ARGS\",[THREADNO]的含义同上。
如果你要向你进程中的所有的线程发出命令使用[ALL]选项。
无论gdb何时中断了你的程序(因为一个断点或是一个信号),它自动选择信号或
断点发生的线程为当前线程。gdb将用一个格式为\"[Switching to SYSTAG]\"的消息
来向你报告。
orc1984 2007-04-12
  • 打赏
  • 举报
回复
设断点 在你需要调试滴地方 他滴入口处设置断点
做鸡真好吃 2007-04-12
  • 打赏
  • 举报
回复
up~
不想低调 2007-04-11
  • 打赏
  • 举报
回复
帮顶
Wolf0403 2007-04-11
  • 打赏
  • 举报
回复
至于你的所谓“深层次问题”。。去研究一下 Linux 的 futex(2) 和 futex(4) 两篇 man pages,你可以发现所有这些都可以用 futex 实现。
Wolf0403 2007-04-11
  • 打赏
  • 举报
回复
GDB:
info threads 列出线程
thread n 跳转到线程

最好的方法。。。偶还是喜欢在出现死锁的时候 kill 得到 core dump 然后分析。良好的编程习惯可以避免不少错误。
CathySun118 2007-04-11
  • 打赏
  • 举报
回复
日志比较好,记录详细些
cwowlonglong 2007-04-11
  • 打赏
  • 举报
回复
多线程调试最好的办法就是打印日志了,其他办法调试出来的都无法反映真实情况
dukang_2005 2007-04-11
  • 打赏
  • 举报
回复
同步互斥,信号量,PV操作,临界区都是操作系统中的概念,建议去读读《操作系统概念》第六版,
===================================================================================
我知道都是操作系统的概念,这些都是讲讲概念性的,具体在指令级别是怎么实现的还是不知道

我是想从指令级别也就是汇编的程度上来理解它们是怎么实现的
zhenhaojia 2007-04-11
  • 打赏
  • 举报
回复
多设断点(每个关心线程的关键部分),

gdb>> b thr_func1
gdb>> b thr_func2
...
gdb>> b thr_funcn

gdb>> c 到下一断点。

gdb>> thread 1,2,3,... (切换线程)

totoorange 2007-04-11
  • 打赏
  • 举报
回复
多线程调试可以用日志,断点等。
同步互斥,信号量,PV操作,临界区都是操作系统中的概念,建议去读读《操作系统概念》第六版,高教出版的。
freshui 2007-04-11
  • 打赏
  • 举报
回复
多线程比较难调吧

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧