【问题标题】:Understanding the output of electric fence and gdb了解电围栏和gdb的输出
【发布时间】:2011-05-10 12:07:57
【问题描述】:

当调试一个以段错误终止的程序时,电子围栏与 gdb 一起返回:

"ElectricFence Exiting: mprotect() failed: Cannot allocate memory [Thread 0xb0bd4b70 (LWP 5363) exited] Program exited with code 0377.

我实际上认为电围栏会更有帮助。这是什么意思?我该如何解释这条信息?似乎没有任何堆栈可供我查看,或者至少 bt 不会返回任何内容。

任何建议都将不胜感激。

谢谢!

【问题讨论】:

  • 另外,当我调试程序时,它看起来并没有消耗所有的内存......还有大约 1GB 的内存,这是它的一半。所以我什至不应该关心交换空间,对吧?

标签: debugging segmentation-fault gdb electric-fence


【解决方案1】:

ElectricFence 的输出只是表示 内存不足,无法帮助您。

ElectricFence 会产生非常高内存开销,尤其是对于具有大量小堆分配的程序。

如果您使用的是 Linux,请尝试使用 Valgrind。

另外请注意,您对一个因SIGSEGV 而死的程序的第一步应该使用 ElectricFence 运行它;相反,您应该在调试器下运行程序并查看 在哪里它崩溃了。

【讨论】:

  • 嗯...当它返回该消息时,我仍有大量可用内存。会不会一下子就用完了?这很奇怪。
  • 那么,无论如何,如果不是在这种情况下,我应该在什么时候使用电围栏?
【解决方案2】:

您可能已经用完了内存映射区域。使用调试分配器时,默认值较低。这可以在运行时通过

进行调整
echo 128000 > /proc/sys/vm/max_map_count

或者通过将此行添加到 /etc/sysctl.conf 并重新启动:

vm.max_map_count = 128000

max_map_count 数默认为 65530,如有必要,可以增加到 MAX_INT。

欲了解更多信息,请参阅:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 2019-06-14
    • 2015-04-14
    • 2020-02-08
    相关资源
    最近更新 更多