程序简单,没有调用堆栈,"inpossible"查找错误

Simple program, no callstack, "inpossible" to find error

本文关键字:错误 inpossible 查找 堆栈 调用 简单 程序      更新时间:2023-10-16

当我在我的工作机器上运行时(win7 VS2010终极sp1)

int main()
{
    unsigned i = 5;
    i %= 0;
    return 0;
}

int main()
{
    int * ip = 0;
    *ip = 4;
    return 0;
}

我得到整数除以零未处理的异常。当我点击break按钮时,为了查看问题,我的调用堆栈只包含msvcrt100d和ntdll,Visual studio在LeaveCriticalSection( _locktable[locknum].lock );行的文件mlock.c中打断了我。

当我在另一台机器(win7VS2010proff sp1)上运行此代码时,VS会在有问题的行i %= 0;od*ip = 4上完全中断它。

这个错误隐藏在我的项目中,直到我在另一台机器上运行它,我才找到它。如何修复此行为?我需要在我的工作机器上看到它。

我有一个干净的安装Windows7,干净的安装Visual Studio 2010和VS-SP1。我的项目不应该被破坏。我使用CMake生成它,并且同一项目在非工作机器上运行良好。

如有任何建议,我们将不胜感激。

好的,我找到了一个解决方案。

在VS中,转到异常设置(ctrl+alt+e),并在所需的Win32异常中检查Thrown

可以找到更多信息这里和这里。

这里有SO相关的问题。

使用VS编译程序时,它会创建EXE文件和PDB文件,其中包含程序的所有相关调试信息。此外,如果嵌入EXE,则PDB的绝对路径

当EXE崩溃并且您使用VS调试它时,它会尝试在与EXE相同的文件夹中以及嵌入文件中的绝对路径中找到相应的PDB。如果您希望它能够调试程序,那么您必须将PDB与EXE一起复制。请注意,这两个文件必须来自完全相同的编译,否则将无法工作。

然后,VS调试器将再次使用PDB中嵌入的*.c*.cpp文件的绝对路径,尝试向您显示程序的源代码。显然,如果你想让它停在相关的行中,你需要一份来源的副本!如果将源复制到与原始机器中的路径完全相同的路径,它应该可以正常工作。如果没有,您必须打开调用堆栈窗口,双击main函数,它会要求您浏览实际的源。

或者你的设置搞砸了。。。