标签: memory-corruption

几乎所有事情都给Valgrind一个错误(警告:客户端切换堆栈?)

我以某种方式破坏了内存,因为我的程序在随机位置崩溃而没有错误.

我正在使用valgrind --leak-check=full,编译-O0 -g,并且它检测到的第一个问题是第一行int main()

cout << "reading file" << endl;
Run Code Online (Sandbox Code Playgroud)

==5089== Warning: client switching stacks?  SP change: 0x7ff0004f8 --> 0x7feb7de10
==5089==          to suppress, use: --max-stackframe=4728552 or greater
==5089== Invalid write of size 8
==5089==    at 0x41E107: main (Dgn.cpp:2833)
==5089==  Address 0x7feb7de08 is on thread 1's stack
Run Code Online (Sandbox Code Playgroud)

它继续下去

==5089== Invalid read of size 8
==5089==    at 0x5DE6E10: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.18)
==5089==    by 0x67AEDE4: (below main) (libc-start.c:260) …
Run Code Online (Sandbox Code Playgroud)

c++ valgrind memory-corruption

20
推荐指数
3
解决办法
9576
查看次数

什么可能导致JavaScript中的内存损坏?

我正在开发一个使用TinyMCE编辑器的应用程序,允许用户修改内容.我开发了一个Prototype.js类,在初始化时,它会生成一个唯一的ID,并在<div>具有该ID的情况下创建一个TinyMCE编辑器.这是一些相关的代码:

Region = Class.create(
{
  initialize: function(options)
  {
    this._editorReady = false;
    this._index = Region.nextIndex++;
    this._uid = com.digitalfruition.Customizer.TypeRegion.uidPrefix+this._index;
    Region.instances.push(this);
    this.setupTinyMCE();
  },

  uid: function()
  {
    return this._uid;
  },

  index: function()
  {
    return this._index;
  },
Run Code Online (Sandbox Code Playgroud)

在很多地方,我会指Regionuid(),例如,当事件TinyMCE的编辑器内发生(例如,选择更改)我的处理程序给出的编辑器的ID.我会经常这样做:

var index = Region.instances.invoke('uid').indexOf(uid);
Run Code Online (Sandbox Code Playgroud)

查找Region反映事件发生的接口的实际实例.

我只设置_uid的任何财产Region,一旦.我很确定这一点.

但是在Firefox 9.0.1中,我看到了非常奇怪的行为.当事件触发时,无法找到他们正在触发的编辑器,因为index在上面的代码中是-1.在Firebug中检查后,我看到了这个:

屏幕捕获奇怪的行为

这些是来自我的代码的调试消息,记录各种事物(在这种情况下区域的高度)以及区域的this.uid()值.内存似乎已损坏!你甚至可以看到它发生的地方,第一个带圆圈的日志条目是正确的,后续的条目是错误的.

相同的代码在Safari和Chrome中运行良好.到目前为止只有Firefox 9.0.1似乎受到影响......

为了进一步检查,我在Firebug控制台中运行了它:

>>> com.digitalfruition.Customizer.TypeRegion.instances.invoke('uid');
["?????????????????eg?????"]
Run Code Online (Sandbox Code Playgroud)

这对我来说毫无意义.什么可能导致JavaScript中的内存损坏?我怎么去解决这种情况呢?

javascript memory-corruption

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

"this"指针在堆栈跟踪中被破坏

我见过这个帖子.我的情况略有不同,我正在努力弄清楚"this"指针是如何被破坏的.

我正在使用Qt 4.6.2框架,使用他们QTreeView自己的模型.我得到的回溯(86帧长,有很多递归,这就是为什么我没有粘贴整个东西,它在这个pastebin中只涉及他们的代码.

它最终在QBasicAtomicInt :: deref中对一些汇编​​程序进行了段错误,但很明显它已经进一步消亡,这三个框架证明了这一点:

#15 0x01420fd3 in QFrame::event (this=0x942bba0, e=0xbf8eb624) at widgets/qframe.cpp:557
#16 0x014bb382 in QAbstractScrollArea::viewportEvent (this=0x4, e=0x93f9240) at widgets/qabstractscrollarea.cpp:1036
#17 0x0156fbd7 in QAbstractItemView::viewportEvent (this=0x942bba0, event=0xbf8eb624) at itemviews/qabstractitemview.cpp:1610
Run Code Online (Sandbox Code Playgroud)

在第17帧中,this0x942bb0.在第16帧中,this应该是相同的,如在第17帧中它调用它的祖先的相同方法的实现.但是this变成0x4.

有趣的是在第15帧(同样,第16帧已经调用其祖先的相同函数的实现),'this'指针被恢复为0x942bba0.

如果您查看完整回溯的pastebin,您可能会看到一些"值优化输出".我已经使用优化编译了应用程序; 我现在已经设置了gcc,-g3 -O0所以下次我可能会有更多的东西.但是当然现在我不能让它崩溃 - 这是一个相当困难的错误(尽管如此仍然非常重要)所以我不认为这太可疑了.

鉴于优化,是this pointer=0x4不寻常或绝对错误?奇怪的是,在任何这些viewportEvent帧中都没有真正的代码 - 它们只是对事件的类型进行切换,它通过switch语句,并返回其祖先的实现.

Valgrind似乎没有抛出任何问题,尽管我还没有让它在Valgrind中崩溃.

以前有人见过这种行为吗?可能是什么原因造成的?

c++ qt4 this memory-corruption stack-corruption

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

使用std :: initializer_list导致内存损坏

我在这段代码中有内存损坏:

#include <string>
#include <iostream>
#include <vector>
#include <initializer_list>

int main() {
    std::vector<std::initializer_list<std::string>> lists = {
        {
            {"text1"},
            {"text2"},
            {"text3"}
        },
        {
            {"text4"},
            {"text5"}
        }
    };

    int i = 0;
    std::cout << "lists.size() = " << lists.size() << std::endl;
    for ( auto& list: lists ) {
        std::cout << "lists[" << i << "].size() = " << lists[i].size() << std::endl;
        int j = 0;
        for ( auto& string: list ) {
            std::cout << "lists[" << i << "][" << j << …
Run Code Online (Sandbox Code Playgroud)

c++ memory-corruption c++11

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

glibc堆一致性检查

  1. 根据2008年的帖子(我现在找不到它),glibc堆检查在多线程环境中不起作用.现在还是2010年的情况吗?
  2. 默认情况下是否启用堆检查?(gcc 4.1.2)?我没有设置MALLOC_CHECK_,不知道调用mcheck(),但仍然有时会收到带有backtrace的双重自由glibc错误.也许它是由一些编译标志启用的?

gcc glibc memory-corruption

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

尝试读取或写入受保护的内存.这通常表明其他内存已损坏

我真的不明白这个错误是如何发生的.请自行检查代码

    void dispatcherTimer_Tick(object sender, EventArgs e)
{
    string srUrl = lstLocalIndex[irLocalIndex] + lstMainIndex[irMainIndex].Replace("0;","");

    Task.Factory.StartNew(() =>
    {
        startNewWindow(srUrl);
    });

}


    void startNewWindow(string srUrl)
{
    NewWindowThread<TitleWindow, string>(c => new TitleWindow(c), srUrl);
}
Run Code Online (Sandbox Code Playgroud)

现在这段代码就是发生错误的地方.我还会附上截图

        private void NewWindowThread<T, P>(Func<P, T> constructor, P param) where T : Window
    {
        Thread thread = new Thread(() =>
        {
            T w = constructor(param);
            w.Show();
            w.Closed += (sender, e) => w.Dispatcher.InvokeShutdown();
            try
            {
                System.Windows.Threading.Dispatcher.Run();
            }
            catch
            {

            }
        });
        thread.SetApartmentState(ApartmentState.STA);
        try
        {
            thread.Start();
        }
        catch
        {

        }
    }
Run Code Online (Sandbox Code Playgroud)

此错误导致整个软件抛出错误并停止工作,即使我在新线程中调用它们:( …

c# wpf unhandled-exception memory-corruption access-violation

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

调试令人讨厌的SIGILL崩溃:文本段损坏

Ours是一个运行Linux的基于PowerPC的嵌入式系统.我们遇到了一个随机的SIGILL崩溃,可以看到各种各样的应用程序.崩溃的根本原因是将要执行的指令归零.这表示驻留在内存中的文本段损坏.由于文本段以只读方式加载,因此应用程序无法破坏它.所以我怀疑一些常见的子系统(DMA?)导致这种腐败.由于问题需要数天才能重现(由于SIGILL而崩溃),因此很难进行调查.首先,我希望能够知道任何应用程序的文本段是否以及何时被破坏.我查看了堆栈跟踪和所有指针,寄存器是正确的.
你们有什么建议我怎么办?

一些信息:
Linux 3.12.19-rt30#1 SMP Fri Mar 11 01:31:24 IST 2016 ppc64 GNU/Linux

(gdb)bt
0 xxx中的0x10457dc0

反汇编输出:
=> 0x10457dc0 <+80>:mr r1,r11
0x10457dc4 <+84>:blr

地址为0x10457dc0的
指令:0x7d615b78捕获SIGILL 0x10457dc0后的指令:0x00000000

(gdb)维护信息部分
0x10006c60-> 0x106cecac在0x00006c60:.text ALLOC LOAD READONLY CODE HAS_CONTENTS

预期(从应用程序二进制):
(GDB)的x/32 0x10457da0
0x10457da0:0x913e0000 0x4bff4f5d 0x397f0020 0x800b0004
0x10457db0:0x83abfff4 0x83cbfff8 0x7c0803a6 0x83ebfffc
0x10457dc0: 0x7d615b78 0x4e800020 0x7c7d1b78 0x7fc3f378
0x10457dd0:0x4bcd8be5 0x7fa3eb78 0x4857e109 0x9421fff0

实际(处理SIGILL并转储附近的内存位置后):
错误指令地址:0x10457dc0
0x10457da0:0x913E0000
0x10457db0:0x83ABFFF4
=> 0x10457dc0:0x00000000
0x10457dd0:0x4BCD8BE5
0x10457de0:0x93E1000C

编辑:
我们的一个主要原因是损坏始终发生在以0xdc0结尾的偏移处.
例如Faulting
指令地址:0x10653dc0 <<我们的应用程序在捕获SIGILL Faulting
指令地址后打印:0x1000ddc0 <<我们的应用程序在捕获SIGILL flash_erase后 …

c c++ linux linux-kernel memory-corruption

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

在malloc()之后写入指针越界,不会导致错误

当我尝试下面的代码时它工作正常.我错过了什么吗?

main()
{
    int *p;
    p=malloc(sizeof(int));
    printf("size of p=%d\n",sizeof(p));
    p[500]=999999;
    printf("p[0]=%d",p[500]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用malloc(0*sizeof(int))或其他任何东西,但它工作得很好.当我根本不使用malloc时,程序只会崩溃.因此,即使我为数组p分配了0个内存,它仍然可以正确地存储值.那么为什么我甚至不打扰malloc呢?

c malloc memory-corruption

6
推荐指数
3
解决办法
4076
查看次数

在ruby 1.9.3上运行rails时出现分段错误

运行一个相当大的rails应用程序,我们最近开始将它升级到rails 3.

我们的堆栈是ruby-1.9.3p484,rails 3.2.16和乘客4.0.23在apache之上运行.

在我们的几台机器上投入一些流量之后,我们开始注意到一些非常奇怪的错误.

诸如随机方法没有在明显具有它们的对象上定义,实例变量在AR关联内是nil,以及对象被随机替换为'false'之类的东西.只是所有奇怪的行为.

检查apache的日志给了我们另一些信息,即随着这些错误的进入,通常情况下,他们各自的流程也会在应用程序的随机位上流行.

有时它只是一个ruby节点作为null传入,有时它只是一些随机字符串溢出,只是随机的东西被破坏.

这些都不是在测试过程中发生的,所以迄今为止唯一的"可靠"再现方法就是在相应的机器上投放流量,看看他们何时/是否开始表现出这种行为.

完成所有这些之后,这里列出了我们迄今为止已经排除的事项:

  • 乘客的垃圾收集
  • rails 3本身(显然我们之前也已经得到过这些,但它们相距甚远,不会引发任何警报)
  • 序列化/推送进出memcached的东西
  • libxml - 有一些关于版本2.5.0导致内存损坏的报告,升级到2.7.0并没有真正有所作为
  • 关闭预链接(这可能会导致内存损坏,根据https://www.ruby-forum.com/topic/205897)

将GC设置恢复到库存似乎已经缓解了这个问题,但我们在这方面确实没有任何结论.看起来似乎更多的集合会导致问题的发生率降低.

有关可能导致此问题或我们可以用来帮助我们查明问题的任何想法?

ruby ruby-on-rails passenger memory-corruption ruby-on-rails-3

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

诊断神秘的valgrind"无效写"

[这是冗长而充满细节的.我的具体问题由下面的粗体字问题引入.]

摘要

我们在valgrind下运行一些测试套件,遇到一个对我来说没什么意义的错误.我正在寻找有关更详细地弄清楚可能出错的建议.

  • Valgrind抱怨"写8号无效".
  • 从运行到运行,错误是一致的,但是应该是不相关的代码更改,不同的编译器/ stdlib版本等.
  • 写入的地址位于堆栈中,据我所知,这是我们编写代码的完全合理的地址.
  • 它的对齐与写入的大小一致.
  • 它发生的地方深入标准库内部.

所有这些都闻起来好像真正的问题在其他地方:某些东西正在变得腐败并导致后来的混乱.但这是valgrind报告的第一个问题,所以如果在其他地方有内存踩踏,那么valgrind就无法抓住它.我怀疑要么我错过了一些明显的东西,要么有一个微妙的问题,那些具有比我更有专业知识的人可能能够指出我.

一些细节

以下是一些细节和一些具体问题.

这是在x64硬件上运行Ubuntu 14.04的Linux机器上.

这是valgrind在一个相当典型的例子中的抱怨:

==14259== Invalid write of size 8
==14259==    at 0x662BBC9: __printf_fp (printf_fp.c:663)
==14259==    by 0x6629792: vfprintf (vfprintf.c:1660)
==14259==    by 0x664D578: vsnprintf (vsnprintf.c:119)
==14259==    by 0x52DCE0F: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==14259==    by 0x52E3263: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_float<double>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, char, double) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==14259==    by 0x52E354F: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, double) const …
Run Code Online (Sandbox Code Playgroud)

c++ stack-overflow valgrind memory-corruption eglibc

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