• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2023-03-06 23:31 Aet 隐藏边栏 |   抢沙发  10 
文章评分 1 次,平均分 5.0

02_27

shared_ptr

lambda

02_28

自定义消息

自定义系统唯一消息

windbg调试

UI库区别

软件卡的分析

  1. 表现为进程中某个或多个线程卡死,可能是UI主线程,也可能是其他线程。
    1. UI主线程的话,可能是UI界面无法点击、无法操作
    2. 其他线程的话可能是相关模块无法正常运转
  2. 一般线程卡死或阻塞主要是死循环或者死锁导致的

死循环

  1. 会表现出CPU占用高的现象
  2. 可能是代码里面循环的退出逻辑不正确,导致无法退出循环
  3. 还可能是部分消息的产生与处理存在循环

死循环排查

  1. 死循环一般表现为CPU占用高,一般是发生在某个线程中
  2. 可以用一些工具,process explored或者process hacker等查看哪个线程占用CPU比较高
  3. 然后查看对应线程的函数调用堆栈,通过函数调用堆栈判断死循环发生在哪个函数中

死锁

  1. 一般发生在多个线程之间,涉及两个或两个以上的锁

死锁排查

  1. 死锁可通过运行日志来排查,也可以通过调试工具来排查
  2. 分析死锁问题,首先要确定死锁的是哪几个线程,可以查看线程堆栈,如果线程卡在EnterCriticalSectionWaitForSingleObject等函数上,可能是发生死锁的线程
  3. !locks查看所有临界区对象
    1. 可以看到临界区内核对象的地址和拥有所有权的线程id
  4. 切到目标线程
  5. 查看目标线程的堆栈
    1. 也可以用kv看带参数的线程堆栈,找到内核对象的地址
  6. 确定对应线程后,定位发生问题的代码

界面卡死的分析

  1. 可能是在UI线程读写文件
  2. 可能是UI线程中用了Sleep

GDI是CPU还是GPU绘制

  1. 利用CPU进行计算

SendMsg和PostMsg

  1. sendmessage是同步的。
    postmessage是异步的。
  2. sendmessage它等待消息被处理完了才返回,如果消息不被处理,发送消息的线程讲一直被阻塞。
    postmessage只把消息放入队列,不管消息是否被处理就返回。
  3. 如果在同一个线程内,sendmessage发送消息时,由USER32.DLL模块调用目标窗口的消息处理程序,并将结果返回。sendmessage在同一线程中发送消息并不入线程消息队列。postmessage发消息时,消息要先放入线程的消息队列,然后通过消息循环分派到目标窗口。
  4. 如果在不同的线程内,sendmessage发送消息到目标窗口所属线程的消息队列,然后发送消息的线程在USER32.DLL模块内监视和等待消息处理,直到目标窗口处理完返回。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享