程序异常崩溃后用windbg辅助调试解决的经验 以及 堆栈问题调试经验

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显示堆栈信息时候会同时显示代码行数

posted on 2018-12-06 12:40  J·Marcus  阅读(1630)  评论(0编辑  收藏  举报

导航