【问题标题】:Debugging error in STLSTL 中的调试错误
【发布时间】:2010-11-30 21:57:57
【问题描述】:

我在使用 STL、C++ 和 Visual Studio 时遇到了一个大问题。当我使用一些 std 或 stl 函数(在调试编译中)时,会出现一些错误,例如 "Incorrect format specifier"

但是我的代码对于“手动搜索”这个错误来说太大了。也许有人知道如何在查找错误时获得一些帮助,比如__FILE____LINE__ 用于断言?因为程序代码太大。

或者try & catch 我最后的希望?...

尊重亚历克斯

【问题讨论】:

  • 错误信息应该指定源文件和它关联的行号...
  • @Oli:我认为这个来自 CRT,没有文件/行信息。
  • 我不明白。编译器没有给出所有编译错误的文件&行吗?
  • @DeadMG:我认为这是运行时错误,而不是编译错误。
  • 听起来不像是编译器错误,而是断言。 “不正确的格式说明符”听起来像是 printf 样式的格式字符串错误。 ---- @Alex 更好地描述您遇到的错误(或者如果您不确定,可以发布屏幕截图)。

标签: c++ visual-studio visual-studio-2010 visual-c++ stl


【解决方案1】:

既然你有 STL 的源代码,我要做的就是在“不正确的格式说明符”字符串所在的位置设置一个断点。对该字符串执行 grep(例如在文件中查找),在每个字符串处设置一个断点,运行您的程序并希望死亡。 :)

【讨论】:

  • 是的,但我说的是我只有在其他 PC 上才有这个问题(当 MSVC 未附加到我的程序时)。
  • @Alex:啊,那你的问题就更难了。您可能需要结合使用 sprintf 调试、shotgun 调试和 minidump,或者可能将 WinDbg 连接到客户端计算机。
【解决方案2】:

您谈论的是 try/catch,所以我认为它会引发异常。如果您在调试器中运行您的应用程序,它不会在抛出未捕获的异常时破坏您的程序吗?

编辑:如果您可以在 Linux/g++ 上交替编译,那么在这种情况下,它会留下一个带有回溯的核心。

【讨论】:

  • 当然,如果我使用 MSVC(调试)运行,我会看到堆栈和我的错误等。但是如果我在其他 PC 上运行程序(没有调试模式但有调试编译)我什么都看不到,只有内部文件中的错误行。
【解决方案3】:

也许您可以在控制台上发送状态消息,以便了解错误发生的位置。您可以使用相同的技术在这部分中进行更详细的搜索。根据需要经常执行此操作。
之后,您可以调试您的程序并在“问题区域”中设置断点并单步执行。

编辑:如果您能够在 linux 上编译程序,您可以简单地安装并运行 valgrind memcheck。它应该打印出带有行号的所有错误。

【讨论】:

  • 仅在 Windows 平台中 :( 。我知道 valgring 但是...对于 Windows 仅旧的和停止的项目或商业项目,我一无所知
  • 因为您的代码依赖于平台或者您没有 linux?在最后一种情况下,您可以尝试使用 live-cd(例如 Ubuntu)并在运行时安装所需的 progs。
【解决方案4】:

附加的屏幕截图清楚地表明您遇到了运行时断言,甚至提供了直接进入调试器的选项。这将带你到错误的调用堆栈。

此消息是_CrtDbgReport 的默认模式。使用_CrtSetReportHook2,您可以在打印错误之前运行自己的代码。例如,您可以创建一个小型转储。

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    相关资源
    最近更新 更多