代码之家  ›  专栏  ›  技术社区  ›  FryGuy

如何在应用程序退出时诊断访问冲突

  •  3
  • FryGuy  · 技术社区  · 17 年前

    我有一个正在调试崩溃的应用程序。但是,由于以下几个原因,很难检测到问题:

    • 崩溃只发生在发布版本中,这意味着符号不可用

    所谓崩溃,我指的是以下例外情况:

    0xC0000005: Access violation reading location 0x00000000.
    

    您将使用什么策略来诊断此问题?

    到目前为止,我所做的是从我的程序中删除尽可能多的代码,直到得到导致崩溃的最小值。这似乎发生在静态链接到项目的代码中,因此也没有帮助。

    3 回复  |  直到 17 年前
        1
  •  5
  •   Nemanja Trifunovic    17 年前

    您甚至可以为发布版本生成生成符号文件。执行此操作,运行程序,附加调试器,关闭调试器,然后在调试器中查看崩溃的原因。

        2
  •  1
  •   Jonathan Leffler    17 年前

    您似乎有读取空指针的内容—永远都不好。

    我不知道你在哪个站台。根据Linux,你可以考虑使用 valgrind

    除了调试信息的存在或不存在外,发布版本与调试版本有什么不同?

    您能否构建包含调试信息的静态链接代码?您能获得静态链接代码的调试版本吗?

        3
  •  1
  •   paxdiablo    17 年前

    但是,可能不是您的代码出了问题。需要注意的一件事是,我们在AIX上发现了这个问题,即使您运行的是Windows,它也可能类似。

    我们有一个第三方库,它动态加载另一个共享库,该共享库在其初始化例程中设置了一个atexit函数,以便在进程退出时调用。

    这显示为访问冲突 从main()返回后 所以,如果这是发生在你身上的事情,几乎可以肯定这是同样的事情。C RTL启动代码将遍历atexit列表并调用其每个函数,无论您对它们做了什么。

    当然,如果它在main()退出之前崩溃,那么这是一个没有意义的问题。

    有一件事你可以考虑(我们在跟踪和修复一个特别棘手的bug的成本/效益分析之后,在一个事实上做到了这一点):把调试版本作为产品发送出去。如果它没有崩溃,这可能是一个快速修复,让产品在那里,而你的工作更可接受的解决方案在您的休闲。