【问题标题】:What is the symbol `myLibrary!__scrt_stub_for_is_c_termination_complete+0x12345`什么是符号`myLibrary!__scrt_stub_for_is_c_termination_complete+0x12345`
【发布时间】:2019-08-23 17:45:54
【问题描述】:

符号myLibrary!__scrt_stub_for_is_c_termination_complete+0x12345 出现在崩溃应用程序的堆栈跟踪中。它是用 MSVC2015 编译的 C++,大量使用 Qt。

myLibrary 没有明确实现该名称的任何内容。

Google 显示了该名称的一些点击量,因此显然它并非针对这一应用程序。但我找不到它的解释。

【问题讨论】:

  • 这是解释here§SEH。
  • @YSC 在其中一个代码 sn-ps 中出现符号名称。但我在文中看不到它的任何参考,也没有任何解释的暗示。
  • 你能在堆栈跟踪中显示更多函数吗?至少调用__scrt_stub_for_is_c_termination_complete 的函数和它调用的函数。 CRT 是静态链接(.LIB)还是动态链接(.DLL)?可以显示__scrt_stub_for_is_c_termination_complete的汇编代码吗?
  • 尝试运行 DrMemory。你可以从here下载它

标签: c++ windows debugging stack-trace msvcrt


【解决方案1】:

这是一个“不知道它在哪里崩溃”的诊断。 +0x12345 偏移量太大了。一点也不罕见,您需要良好的 PDB 才能获得准确的堆栈跟踪。没有它们,它对您编写的代码一无所知,只能通过命名的 DLL 入口点。

由于似乎在 C 运行时库中检测到了崩溃,因此您很可能会幸运地启用 Microsoft 符号服务器并让它生成您需要的 PDB。假设您在 VS 中打开了 minidump,请使用工具 > 选项 > 调试 > 符号来启用服务器。在this MSDN page 中提供了一般和 WinDbg 建议。

【讨论】:

  • 谢谢!但是我已经有了一个符号名称,我想知道这个函数的作用,它是否是编译器可能插入到我的代码中的东西。我现在知道它来自msvcrt.dll
  • 您的机器上有源代码,只需在 vc/crt/src 目录中搜索“_is_c_termination_complete”即可。您应该在utility.cpp 中结束,只是当DLL 卸载并负责清理时运行的goo。您会在堆栈跟踪中看到它的一个非常典型的原因是程序在程序退出时由于堆损坏而导致程序炸弹。危险地迫使我猜测原因顺便说一句,就像猜测它实际上与该功能有关,这是这个答案的核心。
【解决方案2】:

是一个库名:myLibrary
是一个函数名:__scrt_stub_for_is_c_termination_complete
是函数偏移的距离:+0x12345

If you enter the disassembly mode, then you can see a function's address

Also you can see in the (quick)watch to function name, same as disassembly

您可以假设从特定函数引发的异常以及哪一行。

注意:如果您在 Release build 中进行调试,将很难找到哪个代码引发了 例外。在这种情况下,您可以在 Debug 和 Release 之间比较您的程序集(我无法解释它是如何工作的,直到描述为止。)。使用 Debug Build 来轻松调试。

快乐编码:)

【讨论】:

    猜你喜欢
    • 2011-12-14
    • 2010-09-09
    • 2012-09-23
    • 2010-11-23
    • 1970-01-01
    • 2010-09-09
    • 2012-04-19
    • 2021-02-13
    • 1970-01-01
    相关资源
    最近更新 更多