记一次憨批的windows app crash

最近在公司负责一个小模块在windows跑。突然运行一个程序,直接崩溃,话不多说,上图

这咋整,先用任务管理器coredump再说,ok,这叫给进程照快照,这确实非常有用保护现场,方便慢慢分析。

 

OK,用windbg打开coredump

找到了一个一个check 是哪个线程出现的异常,看样子是02号线程,它的栈有点不一样,因为好像出现了异常,KiUserExceptionxxxxx,

记住 agent_monitor+0x127b,这里报的异常,打开windbg反汇编窗口,定位到这里

看到红色部分 00000001`3ff01250,这里好像是一个函数开头,

这里不管三七二十一,先将程序全部反汇编,使用dumpbin,这是vs自带的工具

dumpbin /DISASM agent_monitor.exe > agent_monitor.asm,

ok打开agent_monitor.asm

突然看到 140001000,然后想起来,虽然PE的代码段会重定位,但是它是4k对齐的,也就是对齐到一个页,

因此,它的页内地址始终不变,虽然重定位了,上面 00000001`3ff01250 页内地址是250,

搜索250,对比反汇编指令,找到对应的地方

确实找到了,记住 0000000140001250

用ida打开agent_monitor.exe

因此

 

 找到了点进按f5,

 

 卧槽这个函数怎么会崩溃呢,根据结构找到源代码

 

 这个函数怎么会崩溃呢,除非这个buffer不对,

 确实是之前我忘记给 card[i].magic 取地址了,其实有调试符号更好找,因为我当时没有编译出带调试符号版本

此时我想说的是,这样的强制类型转换居然没有报警告,这是一个惨痛的教训,

难怪之前CTO硬要用pclint,如果用了pclint,此时必定有警告,有时候pclint可以

救命,其实写有指针的语言就像是拿着小刀的人,有用但有时会伤到自己,lint工具就是刀鞘

,虽然这是定位bug的,但是我想说的是写代码别学我

 

posted @ 2021-06-19 00:12  maojun1998  阅读(94)  评论(0编辑  收藏  举报