死锁排查

在做这个实验之前,需要先构建数据。 首先是声明两个全局临界区和两个互斥对象 四个线程 全局变量初始化以及线程创建: 整个代码比较简单,就是4个线程,会进入临界区和互斥对象。由于进入顺序不一样,就会导致死锁。 编译好后,生成了EXE:deadlocks.exe 用windbg启动调试。 并观察屏幕输出。由于每个线程都会打印日志。如果不再打印日志了就证明死锁了。 (死锁的明显现象就是线程停止,处在等待状态。调入NtWaitForSingleObject等函数中不出来。所以当产生死锁时,CPU占用一定不高。) 楼主发现屏幕只打印了两条日志就停止打印了(由于死锁发生的时机跟线程调度有关,你在测试时可能输出的日志与楼主不同,死锁时堆栈也不同,不过排错的原理是一样的)。 看样子是锁住了。 按Ctrl+Break,进入调试状态 楼主要看都有哪些线程锁住了,查一下所有线程的调用栈 通过观察调用栈,发现如下信息 0号线程是主线程,正在等待用户输出,死锁和他没关系 1号线程在等待进入临界区 2号线程也在等待进入临界区 3号线程在等待一个对象,可能是互斥量 4号线程也在等待进入临界区 5号线程是调试线程,忽略之 问题只能出在... Read More | Share it now!

表达式操作

C++表达式的用法 当我们查看某个变量或者下条件断点时,可能会获取一个对象中的成员值。那应该怎么获取呢? c++表达式求值运算:?? C++前缀:@@() 格式化数值:.formats 判断一个地址是否无效:$vvalid 返回0无效,1为有效 数字进制前缀 16进制前缀0x 10进制前缀0n 8进制前缀0t 2进制前缀0y 一般表达式求值:? 字符串比较:$scmp... Read More | Share it now!