我的项目有问题.有时执行失败,错误"无法访问读/写位置xxxxx".我知道这是一个内存损坏错误.但是我如何追踪该错误.它在内存释放变量时失败,如果我评论该行它处理正常.也就是说,这个变量的内存已经被释放了.早些时候它工作正常,我最近添加了代码,但我没有改变任何与此相关的事情.我怎样才能检查内存损坏情况.
我正在学习C并希望在我的系统上安装Valgrind,但是当我尝试安装Valgrin时,我得到一个错误,说Valgrind is OS specific. Sorry我运行的是Windows 7,安装了Mingw64 GIT.我做了一些研究,发现了这一点.根据我需要运行sh ./configure --host x86_64 w64-mingw32但是当我运行它时,我得到以下输出:
$ sh ./configure --host x86_64-w64-mingw32
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for x86_64-w64-mingw64-strip... no
checking for strip... strip
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking whether …Run Code Online (Sandbox Code Playgroud) 我有一个问题,我的代码在将调试与发布进行比较时会返回不同的结果.我检查了两种模式都使用/ fp:exact,所以这不应该是问题.我对此的主要问题是完整的图像分析(它是一个图像理解项目)完全是确定性的,其中绝对没有任何随机性.
另一个问题是我的发布版本实际上总是返回相同的结果(图像为23.014),而debug返回22到23之间的一些随机值,这不应该是.我已经检查过它是否与线程相关,但算法中唯一的多线程部分会为调试和发布返回完全相同的结果.
还有什么可能发生在这里?
Update1:我现在发现的代码负责此行为:
float PatternMatcher::GetSADFloatRel(float* sample, float* compared, int sampleX, int compX, int offX)
{
if (sampleX != compX)
{
return 50000.0f;
}
float result = 0;
float* pTemp1 = sample;
float* pTemp2 = compared + offX;
float w1 = 0.0f;
float w2 = 0.0f;
float w3 = 0.0f;
for(int j = 0; j < sampleX; j ++)
{
w1 += pTemp1[j] * pTemp1[j];
w2 += pTemp1[j] * pTemp2[j];
w3 += pTemp2[j] * pTemp2[j];
} …Run Code Online (Sandbox Code Playgroud) 好吧,这可能听起来很奇怪,但就是这样。
有 2 台计算机A(奔腾 D)和B(四核),其 RAM 量几乎相同,运行 Windows XP。
如果我在两台计算机上运行相同的代码,则分配的私有字节A永远不会下降,从而导致稍后崩溃。看起来B私有字节不断被释放,一切看起来都很好。
在两台计算机中,工作集的释放和分配方式类似。
这可能是清单或 DLL(系统)的问题吗?我一无所知。
另外,我编译了可执行文件A并运行它B,它工作了。
我使用Process Explorer观察了已使用的内存。
在执行期间(我们有多次分配和释放)私有字节数比工作集大得多(1.5 GB 与 70 MB)是否正常?
几个星期以来,我遇到了这种情况,非常令人沮丧,
我的程序调试非常好,没有错误,当我运行程序时它执行作业的初始部分,几秒后它终止于'break continue'选项,并且在调用堆栈中,当我看一看,它转从ntdll.dll和msvcr100d.dll看出它的错误似乎与Windows相关的SDK问题,它似乎也是一个糟糕的指针.我无论如何都无法控制这一点.我安装了Windows SDK到7.0但似乎没有任何改变,
使用:Windows 7 64位,Boost 1.48,Visual Studio编译器(完整版),openCV2.3,c ++.
我尝试了很多选择,
例如.转到任务管理器,右键单击devenv.exe并在"set affinity"中仅选择一个重新安装Windows SDK,重新安装我自己的项目几次.
什么都没有帮助我,有人可以建议我一个很好的解决方案.
为了更清楚,这是我的调用堆栈
ntdll.dll!77e615de()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!77e615de()
ntdll.dll!77e5014e()
msvcr100d.dll!_getptd_noexit() Line 500 C
ntdll.dll!77eb73bc()
ntdll.dll!77ea3c48()
ntdll.dll!77e5016e()
msvcr100d.dll!_getptd_noexit() Line 500 C
ntdll.dll!77eb74df()
ntdll.dll!77eb73bc()
ntdll.dll!77ea3c48()
ntdll.dll!77e5016e()
msvcr100d.dll!_getptd_noexit() Line 500 C
ntdll.dll!77eb74df()
ntdll.dll!77eb73bc()
ntdll.dll!77ea3c48()
ntdll.dll!77e5016e()
msvcr100d.dll!_getptd_noexit() Line 500 C
ntdll.dll!77eb74df()
ntdll.dll!77eb73bc()
ntdll.dll!77ea3c48()
kernel32.dll!770012ea()
kernel32.dll!77001314()
msvcr100d.dll!_getptd_noexit() Line 500 C
ntdll.dll!77eb74df()
ntdll.dll!77eb73bc()
ntdll.dll!77ea3c48()
ntdll.dll!77e5016e()
msvcr100d.dll!_getptd_noexit() Line 500 C
ntdll.dll!77e9b459()
ntdll.dll!77e9b42b()
bowExample.exe!std::_Tree<std::_Tset_traits<CBoWMatch<int>,CBoWMatch<int>::MatchSort,CIndividualPool_NoFree_Allocator<CBoWMatch<int>,128>,0> >::clear() Line …Run Code Online (Sandbox Code Playgroud) 经过一些资源修改(图像),我的程序一直在随机崩溃(0xC0000005).我知道这些来自糟糕的内存管理,但我无法找到它来自哪里,原因有两个:第一,我没有手动使用很多指针或动态分配变量(我的意思是我使用的标准库它对我而言,第二,当我使用gdb进行调试时,错误不会发生(但是在运行调试版本时出现,没有gdb).
我试图找出错误sd::cout,但由于我的程序编写方式,我仍然找不到它.我加倍,三重检查我使用的指针和动态数组,仍然无法找到它.有关信息,调试编译"-g -std=c++14",但没有"-O2".我使用Code::Block64位MingW和GCC 5.1.0以及gdb 7.9.
所以,我读了很多类型的bug(0xC0000005)和Heisenbug,但我不知道如何处理它,我不知道现在该尝试什么.
我会告诉你代码,但它分布在30个文件中.如果你真的想看到的,它在这里 GitHub上虽然.
此外,您将无法测试它,因为我没有上传资源文件(我不拥有它们).
那么你有什么建议让我能够找到bug的来源吗?
我偶然发现了一个我无法理解的奇怪问题.我不是C/C++的专家,所以请耐心等待.我有一个NPC类,它派生自一个Player类,它派生自Sprite类.sprite类包含一个setupAnimation函数,该函数分配一个包含纹理坐标的浮点数组,数组的每个元素都指向一帧动画.这一切都很好,工作正常.
但是,当我向NPC类添加指针数组时会出现问题.这些指针属于Item类类型.当我添加这个数组时,如果数组很小(10是我测试的大小),它可以正常工作,但如果大小有点大(100是我的大小,则为前面提到的纹理坐标分配浮点数组时会崩溃)测试).
以下是一些代码片段,显示了我上面提到的材料:
Item类的指针数组:
engItem* itsLoot[100]; // With 100 here, the crash occurs as shown below
Run Code Online (Sandbox Code Playgroud)
纹理坐标及其分配对应物:
GLfloat* itsTextureXData;
GLfloat* itsTextureYData;
...
animationFile >> frameCount; // Tested, the value is correct
engDeallocate(getTextureXData(), true); // Works fine
itsTextureXData = new GLfloat[frameCount]; // This is where the crash occurs
engDeallocate(getTextureYData(), true);
itsTextureYData = new GLfloat[frameCount];
Run Code Online (Sandbox Code Playgroud)
这段代码是从Sprite类派生的每个类的基础.我无法理解的是为什么在浮动分配期间额外的90个指针会导致问题.只需要一些软件信息
操作系统:Windows Vista 32位,编译器:Visual C++ 9.0,程序运行时内存:~17,600k,系统内存:~2GB
考虑到这一点,我无法看到内存运行干涸,我无法确定指针数组如何导致分配失败.如上所述,分配在从Sprite派生的所有其他类(以及Sprite本身)中都能正常工作,但是一旦这个指针数组被添加到NPC类中,NPC将不再分配这个纹理数据float数组而不会崩溃.
我正在用C++调试一个大项目.有一些解除引用的指针导致随机崩溃.你能建议我最好的指针验证免费工具吗?(识别无效指针的使用)
(否则我需要花费很长时间才能手动完成)
我还使用了Memory Valuator程序来消除大多数内存泄漏,但是在使用无效后使用指针并不是很有帮助.平台是Windows.
在我发布之前,我还研究了其他帖子.是的,它没有帮助.所以我想分享我的研究成果.
其中一个条件是免费工具,我没有找到任何可用的,是的,我已经测试了十几个.大多数建议的工具都是针对泄漏内存而设计的(这不是我想要的.)大多数专业工具(如IBM的purify)都有免费版或试用版,但所有这些都浪费时间(他们只报告数量)问题,但没有具体).
Microsoft Application Verifier等其他工具对内存或兼容性问题非常有用,但它无法识别我的问题.
现在我正在测试商业工具:
内存验证器 - 适用于内存泄漏,但功能"检测已删除"这个'指针'会导致我的应用程序崩溃.(我花了很多时间使用settings/config.)
Bug Validator - 好多了.它确定了一些问题.但是,它经常没用.整个Stack Trace在crt/src/XString或Mutex初始化中或在C++ libs中的一些Critical Sections内.(到目前为止.我希望这些信息会有所帮助.)
有时我的应用程序中的某些代码部分会破坏堆栈.但问题只会在一段时间后才会出现.所以我们无法确定问题的确切位置.是否有任何工具可用于在损坏堆栈后立即检测c ++应用程序中的堆栈损坏?
是否有任何windbg工具来识别这个?
我正在做一个游戏。在某些地方,有时我会收到分段错误,而在所有其他时间代码都可以正常工作。如果我再次运行游戏(在收到分段错误后)它会恢复(没有任何代码更改)并且运行良好。但过了一段时间又发生了这种情况。
我尝试使用 GDB 调试它。我得到以下信息:
任何想法为什么会发生这种情况?
c++ ×9
c ×2
windows ×2
boost ×1
c++14 ×1
crash ×1
debug-mode ×1
memory ×1
mingw-w64 ×1
new-operator ×1
openmp ×1
pointers ×1
release-mode ×1
shared-ptr ×1
valgrind ×1
visual-c++ ×1
windbg ×1
windows-7 ×1