项目里安装了UIA相关的钩子来监听UIA相关事件,退出的时候偶尔会崩溃在ComFriendlyWaitMtaThreadProc中,如下  从上图可以看出 是访问到无效的地址了,用!address 07acf914看下地址信息  确实是不可访问的,但是为啥呢?用ub看了下前面的代码  从红框中我们可以看出edi是指向第一个参数(ebp+8指向第一个参数),用k命令看下调用栈,如下 原来ComFriendlyWaitMtaThreadProc 是线程回调函数啊,那么edi就指向了传入的参数!通过查…
原调试debugwindbgcrash崩溃COM 前言 这是几年前在项目中遇到的一个崩溃问题,崩溃在了ComFriendlyWaitMtaThreadProc()里,没有源码.耗费了我很大精力,最终通过反汇编并结合原代码才最终搞清楚了事情的来龙去脉.本文的分析还是基于真实项目进行的,中间略去了很多反汇编的分析工作.文末有我整理的测试代码,大家可以实际体验一把TerminateThread()的杀伤力. 背景介绍 大概情况是这样的:程序启动的时候,会通过LoadLibrary()加载插件模块.其中…
原调试debugwindbg崩溃crash 前言 最近程序会不定期崩溃,很是头疼!今晚终于忍无可忍,下决心要干掉它!从之前的几个相关的dump可以猜到是有接口未释放导致的问题,但没有确认到底是哪个接口.本篇总结记录了找到这个接口的过程. {% note info %} 这是几年前在项目中遇到的一个问题.我对之前的笔记进行了整理重新发布于此. {% endnote %} 初识问题 用windbg打开dump文件,显示如下: startup 从图中可以很明显的看出来是访问违例(因为红框标识的地址5b…
原调试debugwindbghangprocess explorer 前言 如果我们自己的程序的CPU Usage(CPU占用率)飙升,并且居高不下,很有可能陷入了死循环.你知道怎么快速定位并解决吗?今天跟大家分享几种定位方法,希望对你有所帮助. 如何判断是否有死循环? 通过电脑风扇的声音猜测. 如果风扇一直响个不停,说明电脑很热.高CPU占用率会导致CPU发热量增大,从而导致风扇狂响.如果听到风扇响个不停,可以打开任务管理器看看CPU占用率是不是很高.如果发现是我们的进程导致的高CPU占用率,…
原调试debugwindbg死锁deadlock 前言 最近我们的程序在退出时会卡住,调查发现是在卸载dll时死锁了.大概流程是这样的:我们的dll在加载的时候会创建一个工作线程,在卸载的时候,会设置退出标志并等待之前开启的工作线程结束.为了研究这个经典的死锁问题,写了一个模拟程序,用到的dump文件及示例代码参考附件. {% note info %} 这也是几年前在项目中遇到的一个问题,我对之前的笔记进行了整理重新发布于此. {% endnote %} 关键代码 主程序 WaitDllUnlo…
原调试debugwindbg死锁deadlock 前言 项目里的一个升级程序偶尔会死锁,查看dump后发现是死在了ShellExecuteExW里.经验少,不知道为什么,于是在高端调试论坛里发帖求助,链接如下http://advdbg.org/forums/6520/ShowPost.aspx 根据张银奎老师的描述可知,应该是拥有关键段的线程意外结束了.仔细检查项目中的代码,发现程序中有使用TerminateThread()来强制杀线程的代码.很可疑,于是写了一个测试程序,还原了这个问题. {%…
原调试debugwindbg死锁deadlock 前言 这是几年前在项目中遇到的一个死锁问题,在博客园发布过.我对之前的笔记进行了整理重新发布于此. 本文假设小伙伴们知道一些基本概念,比如什么是.dump文件(转储文件,进程在某一时刻的快照),什么是windbg(windows下的调试利器),windbg的基本用法,调用栈,调用约定,等等. 背景介绍 我们的程序会把dll注入到其它进程,然后后调用SetWinEventHook安装进程内钩子.然后专门开启一个线程来分发监听到的事件信息,并在该线程…
说明: 这里的调试是指使用 lldb 远程调试 iOS 应用 设置断点是指在 ObjC 方法上设置断点 使用场景: 1.调试被 strip 了的 iOS 应用 2.调试被 strip 了的 iOS 系统 dylib 在调试时没有符号的 iOS 应用时,设置断点非常不方便: 1.App:在没有开启 ASLR 时,需要首先找到方法的地址,然后针对地址设置断点 2.Dylib:在没有开启 ASLR 时,需要找到dylib的基地址,然后计算偏移 如果开启了 ASLR,设置断点会更麻烦. 一直想解决这个问…
出问题的原因是路径名太长,换个深度浅一点的路径就好了. 要注意,更换路径之后,要全部重新编译,否则调试的时侯MDK还会找旧路径的源代码.(嗯,MDK毛病是很多!)…
百度百科:内存转储文件 内存转储是用于系统崩溃时,将内存中的数据转储保存在转储文件中,供给有关人员进行排错分析用途.而它所保存生成的文件就叫做内存转储文件. 内存转储文件也被称作虚拟内存,它是用硬盘里的一段空间虚拟成内存来存放程序来运行,由于硬盘的运行速度比内存慢很多,所以虚拟内存应不要很大,操作系统把虚拟内存存在一个文件里,那个文件有多大表示当前操作系统虚拟的内存有多大 . 文章:如何生成转储(dmp)文件--工具篇 文章:WinDbg分析DMP文件方法完全攻略 这个大牛写了很多关于WinDb…