社区
C++ 语言
帖子详情
多线程怎么调试(100)?
dukang_2005
2007-04-11 05:51:37
在linux下C/C++多线程怎么调试(100)?大家说说自己的经验给我们菜鸟听听!
还有一些深层次的问题:
线程同步互斥用到的 信号量 本质是软中断
事件 是信号量的变种
那么互斥体mutex是怎么实现的?实现原理是什么?
PV操作呢?
临界区呢?
...全文
3174
20
打赏
收藏
多线程怎么调试(100)?
在linux下C/C++多线程怎么调试(100)?大家说说自己的经验给我们菜鸟听听! 还有一些深层次的问题: 线程同步互斥用到的 信号量 本质是软中断 事件 是信号量的变种 那么互斥体mutex是怎么实现的?实现原理是什么? PV操作呢? 临界区呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
多线程比较难调吧
C++
多线程
-
多线程
调试
本文介绍了C++
多线程
调试
的方法,包括数据断点、条件断点的设置,以及在Visual Studio中进行
多线程
调试
的步骤。强调了在软件
调试
中的综合运用,提倡早期
调试
,并给出了
多线程
编程的建议。
GDB
多线程
调试
博客围绕GDB
多线程
调试
展开,介绍了
多线程
调试
的必要性,如死锁、数据竞争等问题。阐述了GDB
多线程
调试
核心概念,包括线程基本概念、GDB
多线程
支持概览和常用命令。还给出示范代码,讲解常见问题与
调试
技巧,最后总结
多线程
调试
要点。
gdb
调试
C++
多线程
程序
本文介绍了在C++
多线程
程序中
调试
时遇到的问题,即线程频繁切换。通过学习如何在GDB中使用scheduler-locking参数,解决了在单步
调试
时保持当前线程不被切换的问题,提升
调试
效率。
GDB
调试
多线程
进程 coredump
本文详细介绍了如何使用GDB进行
多线程
和多进程
调试
,包括设置断点、查看线程堆栈、解决死锁、分析coredump等内容。在
调试
多线程
时,探讨了死锁的四个必要条件和银行家算法。在多进程
调试
中,讲解了如何跟踪fork操作,并调整系统设置以生成和利用coredump文件进行
调试
。
IntelliJ IDEA 断点、
多线程
、远程
调试
以及stream
调试
——小技巧汇总
本文详细介绍使用IntelliJ IDEA进行Java
调试
的各种高级技巧,包括Stream
调试
、条件断点、
多线程
调试
、远程
调试
等,帮助开发者高效定位问题。
C++ 语言
65,213
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章