• 程序异常崩溃后用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)

    否则这里的''必然会写在越界的位置上!!

    这个问题之前在win7 64位上跑一直没发现,在32位下才显现。

    真可怕。

    至于难以确认程序出错的具体位置。

    这类问题该如何定位呢?

    方法就是排除法,将怀疑有问题的代码一处处注释掉。

    如果注释了就不会崩溃就说明 堆栈破损问题没有出在这里。

    例如我最后发现,只要不调用上述截图那个dll库函数就不会崩溃,渐渐定位到这个函数里,再具体分析有没有内存越界问题。

    上述这些都是公司里的大神教的,

    感谢!

    3,如果是在没装vs的环境下使用windbg调试,可以将编译的pdb文件放过去

    这样不同的是,windbg显示堆栈信息时候会同时显示代码行数

  • 相关阅读:
    Opencv在mac系统的安装与试用
    VINS 估计器之检查视差
    C语言——第零次作业
    C语言博客05指针
    循环结构
    C语言博客作业数组
    函数3
    C博客作业01分支、顺序结构
    group by的查询
    layui多张图片上传最多9张(新增和修改时的显示问题)
  • 原文地址:https://www.cnblogs.com/rixiang/p/10076075.html
Copyright © 2020-2023  润新知