“映射区域在地址上的权限不正确”对于memset的Valgrind错误

问题描述:

我遇到了似乎是由于堆栈溢出而导致的问题。当我运行Valgrind的下的应用程序,我收到以下错误:“映射区域在地址上的权限不正确”对于memset的Valgrind错误

Thread 75: 
Invalid write of size 4 
    at 0x833FBF6: <Class Name>::<Method Name>(short, short&) (<File Name>:692) 
Address 0x222d75c0 is on thread 75's stack 

Process terminating with default action of signal 11 (SIGSEGV): dumping core 
Bad permissions for mapped region at address 0x222D6000 
    at 0x4022BA3: memset (mc_replace_strmem.c:586) 
    by 0x833FC80: <Class Name>::<Method Name>(short, short&) (<File Name>:708) 

如果我打开GDB的核心文件,转到第1帧,其中的memset被调用,并做了“信息登记”,它显示$ esp = 0x222d5210和$ ebp = 0x222d75c8。

这似乎并不表示该堆栈将包含存储器在地址0x222D6000?如果这是真的,那么为什么我们会得到“错误的权限”错误?

另一个奇怪的是,源文件的第692行是该方法的第一行(即“void::(短var1,短& var2)”)。那么,为什么我们会在这一点上得到无效的写入?

正如我所说的,它似乎是堆栈空间用尽的情况,但即使我们使用“限制stacksize”命令来增加分配的堆栈空间量,我们仍然遇到同样的问题。

我一直在试图调试这个问题,一直在靠墙撞我的头。任何意见,将不胜感激。

你可以做的是激活Valgrind gdbserver和 使用gdb + vgdb附加到在Valgrind下运行的程序。 然后,您可以使用各种valgrind监视器命令来获得有关此问题的更多信息。例如。在寄存器值再看看, 使用“监视v.info调度”看到堆栈跟踪和堆栈大小,...

整个显示器的清单,MEMCHECK + Valgrind的命令可以在 http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.monitor-commands 发现 http://www.valgrind.org/docs/manual/manual-core-adv.html#manual-core-adv.valgrind-monitor-commands

+0

感谢您的建议。我还没有尝试过,因为我们可用的唯一版本的Valgrind是旧版本,不包含gdbserver功能。我正在尝试安装新版本,但这需要时间。 – BCH

事实证明,这个问题是由于堆栈溢出毕竟。我没有意识到产生引起问题的线程的代码明确设置了线程要使用的堆栈的大小。这就是为什么改变“limit stacksize”命令所使用的值并没有什么不同。有一次,我修改了设置堆栈大小的代码以增加分配的内存量,问题就消失了。