Noa*_*oth 4 debugging c++-cli visual-studio
我有一个问题,我的应用程序在执行任何操作之前都失败了调试断言(_CrtIsValidHeapPointer).我知道这是因为我在main函数的第一个语句中添加了断点,并且在到达断点之前它未通过断言.
有没有办法以某种方式"逐步"调用我的主函数调用之前发生的一切?像静态成员初始化等等.
我应该注意我的程序是用C++/CLI编写的.我最近升级到了VS2015,目标是v140工具集.我正在使用的C++库(ImageMagick,libsquish和我自己的C++库之一)已经过单独测试,我没有收到这些库的断言失败,所以它必须是我的主要应用程序.
自从我从VS2013升级以来,我没有更改任何代码,所以我对正在发生的事情感到有点困惑.
编辑:这是调用堆栈.这是在断言失败窗口中单击"重试"之后.然后我会抛出许多其他异常,但每次运行程序时它们都不同.
> ucrtbased.dll!527a6853()
[Frames below may be incorrect and/or missing, no symbols loaded for ucrtbased.dll]
ucrtbased.dll!527a7130()
ucrtbased.dll!527a69cb()
ucrtbased.dll!527c8116()
ucrtbased.dll!527c7eb3()
ucrtbased.dll!527c7fb3()
ucrtbased.dll!527c84b0()
PathCreator.exe!_onexit(int (void)* const function) Line 268 + 0xe bytes C++
PathCreator.exe!atexit(void (void)* const function) Line 276 + 0x9 bytes C++
PathCreator.exe!std::`dynamic initializer for '_Fac_tidy_reg''() Line 65 + 0xd bytes C++
[External Code]
mscoreei.dll!7401cd87()
mscoree.dll!741fdd05()
kernel32.dll!76c33744()
ntdll.dll!7720a064()
ntdll.dll!7720a02f()
Run Code Online (Sandbox Code Playgroud)
您必须调试C运行时初始化代码.不直观,因为调试器努力避免它并让你进入main()入口点.但仍然可以使用Debug> New Breakpoint> Function Breakpoint.
输入_initterm函数名称,Language = C.
按F5键,断点就会命中.您应该看到C运行时源代码.您现在可以逐个单步(**it)()执行程序的初始化函数,每次调用执行一次.
这正是你要求的.但实际上并不太可能.该赔率您的代码产生这个错误是非常低的.更有可能的是,其中一个库导致了这个问题.它们很可能是针对另一个版本的C运行时库构建的.因此有自己的_initterm()函数.
在进程中拥有多个C运行时库副本通常非常不健康.并且极有可能产生堆损坏.如果您无法从堆栈跟踪中找到它(确保将调试器类型从自动更改为混合,始终在SO问题中发布堆栈跟踪),那么您应该强烈考虑的下一件事是使用VS版本重建这些库你用.
| 归档时间: |
|
| 查看次数: |
1199 次 |
| 最近记录: |