有时我的c ++程序在调试模式下崩溃,我得到的是一个消息框,说明某些内部内存管理例程中的断言失败(访问未分配的内存等).但我不知道从哪里调用,因为我没有得到任何堆栈跟踪.如何获取堆栈跟踪或至少查看我的代码中的失败位置(而不是库/内置例程)?
如果发生崩溃,无论是否有调试或发布版本,都可以获得有关崩溃发生位置的信息.即使您在没有源代码的计算机上,也可以看到调用堆栈.
为此,您需要使用使用EXE构建的PDB文件.将PDB文件放在与崩溃的EXE相同的目录中.注意:即使您拥有相同的源代码,构建两次并使用第一个EXE和第二个PDB也不起作用.您需要使用使用EXE构建的确切PDB.
然后将调试器附加到崩溃的进程.示例:windbg或VS.
然后只需检查您的调用堆栈,同时还打开您的线程窗口.您必须选择崩溃的线程并检查该线程的callstack.每个线程都有一个不同的调用堆栈.
如果您已经连接了VS调试器,它将自动转到导致崩溃的源代码.
如果崩溃发生在您正在使用的库中,那么您没有PDB.你无能为力.