1,程序异常崩溃后用windbg辅助调试解决的经验
状况:我的程序调用别人的库做 文件写入工作。
在这一过程中出现异常,程序崩溃。
经反复检查,认为自己的程序没有错,但无法判断在别人库里哪里有错。
使用windbg绑定程序进程进行调试,可以在发生异常时候,获取函数调用顺序,进而知道在哪个函数出了异常。
由截图可见,在我的程序函数CEncryptionUtils::write_user_certs调用别人的MWHwMan库的SDFP_Close函数中调用另一个人的sdfp_lib库中的SD_SafeWrite函数过程中调用TGWriteDevInfo函数时发生了 堆异常…………………………
所以我找到sdfp_lib库作者,刚好是我同事,找他确认这个函数……然后解决问题……………………
上文说的只是调试这种问题的一种思路
可以说,如果没有windbg我是永远不可能解决这个问题的
至于windbg的具体用法就不赘述
或有时间时候再赘述
后续补充两点:1,将编译生成的pbd放在目录,用windbg调试可以提供更多信息,可以具体提供崩溃代码行数
2,崩溃时可以打开任务管理器,选择进程,导出dump文件,再分析dump文件亦可,只是这种方法没有试过
2,堆栈问题调试经验
编程时特别痛苦的就是遇到程序异常闪退问题,特别是那种偶然发生难以复现的bug、特别是那类debug版本没事、release版本就会崩溃的情况、甚至还有64位操作系统下没问题32位操作系统下就有问题的情况…………
即使可以使用windbg一类软件来查看堆栈,也未必有用。
因为程序崩溃的那一行,未必是堆栈造成损坏的那一行。
因为程序总是在堆栈损坏情况下,再次使用堆栈才会发生崩溃。
例如下面这个困扰我半个月的bug:
上述是一个别人写的底层库的函数
结果竟然有错
这里malloc长度不应该是length*2,而应该是malloc(length*2+1)
否则这里的'\0'必然会写在越界的位置上!!
这个问题之前在win7 64位上跑一直没发现,在32位下才显现。
真可怕。
至于难以确认程序出错的具体位置。
这类问题该如何定位呢?
方法就是排除法,将怀疑有问题的代码一处处注释掉。
如果注释了就不会崩溃就说明 堆栈破损问题没有出在这里。
例如我最后发现,只要不调用上述截图那个dll库函数就不会崩溃,渐渐定位到这个函数里,再具体分析有没有内存越界问题。
上述这些都是公司里的大神教的,
感谢!
3,如果是在没装vs的环境下使用windbg调试,可以将编译的pdb文件放过去
这样不同的是,windbg显示堆栈信息时候会同时显示代码行数 |