我以某种方式破坏了内存,因为我的程序在随机位置崩溃而没有错误.
我正在使用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) 我正在开发一个使用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)
在很多地方,我会指Region的uid(),例如,当事件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中的内存损坏?我怎么去解决这种情况呢?
我见过这个帖子.我的情况略有不同,我正在努力弄清楚"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帧中,this是0x942bb0.在第16帧中,this应该是相同的,如在第17帧中它调用它的祖先的相同方法的实现.但是this变成0x4.
有趣的是在第15帧(同样,第16帧已经调用其祖先的相同函数的实现),'this'指针被恢复为0x942bba0.
如果您查看完整回溯的pastebin,您可能会看到一些"值优化输出".我已经使用优化编译了应用程序; 我现在已经设置了gcc,-g3 -O0所以下次我可能会有更多的东西.但是当然现在我不能让它崩溃 - 这是一个相当困难的错误(尽管如此仍然非常重要)所以我不认为这太可疑了.
鉴于优化,是this pointer=0x4不寻常或绝对错误?奇怪的是,在任何这些viewportEvent帧中都没有真正的代码 - 它们只是对事件的类型进行切换,它通过switch语句,并返回其祖先的实现.
Valgrind似乎没有抛出任何问题,尽管我还没有让它在Valgrind中崩溃.
以前有人见过这种行为吗?可能是什么原因造成的?
我在这段代码中有内存损坏:
#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) 我真的不明白这个错误是如何发生的.请自行检查代码
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
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后 …
当我尝试下面的代码时它工作正常.我错过了什么吗?
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呢?
运行一个相当大的rails应用程序,我们最近开始将它升级到rails 3.
我们的堆栈是ruby-1.9.3p484,rails 3.2.16和乘客4.0.23在apache之上运行.
在我们的几台机器上投入一些流量之后,我们开始注意到一些非常奇怪的错误.
诸如随机方法没有在明显具有它们的对象上定义,实例变量在AR关联内是nil,以及对象被随机替换为'false'之类的东西.只是所有奇怪的行为.
检查apache的日志给了我们另一些信息,即随着这些错误的进入,通常情况下,他们各自的流程也会在应用程序的随机位上流行.
有时它只是一个ruby节点作为null传入,有时它只是一些随机字符串溢出,只是随机的东西被破坏.
这些都不是在测试过程中发生的,所以迄今为止唯一的"可靠"再现方法就是在相应的机器上投放流量,看看他们何时/是否开始表现出这种行为.
完成所有这些之后,这里列出了我们迄今为止已经排除的事项:
将GC设置恢复到库存似乎已经缓解了这个问题,但我们在这方面确实没有任何结论.看起来似乎更多的集合会导致问题的发生率降低.
有关可能导致此问题或我们可以用来帮助我们查明问题的任何想法?
ruby ruby-on-rails passenger memory-corruption ruby-on-rails-3
[这是冗长而充满细节的.我的具体问题由下面的粗体字问题引入.]
摘要
我们在valgrind下运行一些测试套件,遇到一个对我来说没什么意义的错误.我正在寻找有关更详细地弄清楚可能出错的建议.
所有这些都闻起来好像真正的问题在其他地方:某些东西正在变得腐败并导致后来的混乱.但这是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)