我遇到的问题似乎是由于堆栈溢出造成的。当我在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中打开核心文件,请转到调用memset的第1帧,并执行&#34; info寄存器&#34;,它显示$ esp = 0x222d5210和$ ebp = 0x222d75c8。 / p>
似乎没有表明堆栈会在地址0x222D6000中包含内存吗?如果这是真的,那么为什么我们会得到'#34;错误的权限&#34;错误?
另一个奇怪的事情是源文件的第692行是该方法的第一行(即&#34; void::( short var1,short&amp; var2)&#34;)。那么,为什么我们会在那时获得无效的写作呢?
正如我所说,似乎是一个耗尽堆栈空间的情况,但即使我们使用&#34;限制stacksize&#34;命令增加分配的堆栈空间量,我们仍然遇到同样的问题。
我试图调试这个问题已经连续几天撞墙了。任何建议将不胜感激。
答案 0 :(得分:0)
你可以做的是激活Valgrind gdbserver,和 使用gdb + vgdb附加到在Valgrind下运行的程序。 然后,您可以使用各种valgrind监视器命令来获得更多 有关问题的信息。例如。再看看寄存器值, 使用'monitor v.info scheduler'查看堆栈跟踪和堆栈大小,...
可以在以下位置找到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
答案 1 :(得分:0)
事实证明,这个问题毕竟是由于堆栈溢出造成的。我没有意识到产生导致问题的线程的代码显式地设置了线程使用的堆栈大小。这就是为什么要更改&#34;限制堆栈大小&#34;所使用的值的原因。命令没有任何作用。有一次,我修改了设置堆栈大小的代码,以增加分配的内存量,问题就消失了。