相关疑难解决方法(0)

如何在C++中检查内存损坏

我的项目有问题.有时执行失败,错误"无法访问读/写位置xxxxx".我知道这是一个内存损坏错误.但是我如何追踪该错误.它在内存释放变量时失败,如果我评论该行它处理正常.也就是说,这个变量的内存已经被释放了.早些时候它工作正常,我最近添加了代码,但我没有改变任何与此相关的事情.我怎样才能检查内存损坏情况.

c++ memory-corruption

5
推荐指数
2
解决办法
1万
查看次数

在Windows 7上获得Valgrind

我正在学习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)

c valgrind windows-7 mingw-w64

5
推荐指数
1
解决办法
2959
查看次数

Debug和Release之间的结果不同

我有一个问题,我的代码在将调试与发布进行比较时会返回不同的结果.我检查了两种模式都使用/ 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)

c++ openmp visual-studio-2010 release-mode debug-mode

4
推荐指数
3
解决办法
1万
查看次数

私有字节&gt;&gt;工作集正常吗?

好吧,这可能听起来很奇怪,但就是这样。

有 2 台计算机A(奔腾 D)和B(四核),其 RAM 量几乎相同,运行 Windows XP。

如果我在两台计算机上运行相同的代码,则分配的私有字节A永远不会下降,从而导致稍后崩溃。看起来B私有字节不断被释放,一切看起来都很好。

两台计算机中,工作集的释放和分配方式类似。

这可能是清单或 DLL(系统)的问题吗?我一无所知

另外,我编译了可执行文件A并运行它B,它工作了。

笔记:

我使用Process Explorer观察了已使用的内存。

问题:

在执行期间(我们有多次分配释放)私有字节数比工作集大得多(1.5 GB 与 70 MB)是否正常?

c++ windows memory-management visual-c++

3
推荐指数
2
解决办法
5274
查看次数

ntdll.dll [下面的框架可能不正确/缺失,没有为ntdll.dll加载符号]

几个星期以来,我遇到了这种情况,非常令人沮丧,

我的程序调试非常好,没有错误,当我运行程序时它执行作业的初始部分,几秒后它终止于'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)

c++ boost visual-studio-2010 shared-ptr

3
推荐指数
1
解决办法
2万
查看次数

如何正确找到Heisenbug?

经过一些资源修改(图像),我的程序一直在随机崩溃(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++14

3
推荐指数
1
解决办法
778
查看次数

内存分配崩溃

我偶然发现了一个我无法理解的奇怪问题.我不是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 crash pointers new-operator

2
推荐指数
1
解决办法
3375
查看次数

指针验证器

我正在用C++调试一个大项目.有一些解除引用的指针导致随机崩溃.你能建议我最好的指针验证免费工具吗?(识别无效指针的使用)

(否则我需要花费很长时间才能手动完成)

我还使用了Memory Valuator程序来消除大多数内存泄漏,但是在使用无效后使用指针并不是很有帮助.平台是Windows.

更新:

在我发布之前,我还研究了其他帖子.是的,它没有帮助.所以我想分享我的研究成果.

其中一个条件是免费工具,我没有找到任何可用的,是的,我已经测试了十几个.大多数建议的工具都是针对泄漏内存而设计的(这不是我想要的.)大多数专业工具(如IBM的purify)都有免费版或试用版,但所有这些都浪费时间(他们只报告数量)问题,但没有具体).
Microsoft Application Verifier等其他工具对内存或兼容性问题非常有用,但它无法识别我的问题.

现在我正在测试商业工具:

内存验证器 - 适用于内存泄漏,但功能"检测已删除"这个'指针'会导致我的应用程序崩溃.(我花了很多时间使用settings/config.)

Bug Validator - 好多了.它确定了一些问题.但是,它经常没用.整个Stack Trace在crt/src/XString或Mutex初始化中或在C++ libs中的一些Critical Sections内.(到目前为止.我希望这些信息会有所帮助.)

c++ windows

2
推荐指数
1
解决办法
226
查看次数

检测堆栈损坏

有时我的应用程序中的某些代码部分会破坏堆栈.但问题只会在一段时间后才会出现.所以我们无法确定问题的确切位置.是否有任何工具可用于在损坏堆栈后立即检测c ++应用程序中的堆栈损坏?

是否有任何windbg工具来识别这个?

c++ windbg

2
推荐指数
1
解决办法
3108
查看次数

随机分段错误

我正在做一个游戏。在某些地方,有时我会收到分段错误,而在所有其他时间代码都可以正常工作。如果我再次运行游戏(在收到分段错误后)它会恢复(没有任何代码更改)并且运行良好。但过了一段时间又发生了这种情况。

我尝试使用 GDB 调试它。我得到以下信息:

  1. 有一个函数调用:func(&s.x),其中 s 是一个结构体,x 是它的 int 类型成员。地址 (&s.x) 是 0xb3456721
  2. 在函数 func 中,参数中接收到的值为 0xb。
  3. 程序崩溃说无法访问 0xb 处的内存。当我使用 GDB 打印变量时,我再次收到无法访问的内存。

任何想法为什么会发生这种情况?

c c++ segmentation-fault

1
推荐指数
1
解决办法
7025
查看次数