问题标签 [electric-fence]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
debugging - 带 pthread 的电子围栏
我正在开发一个多线程(基于 pthread)的项目。该项目使用我正在编写的库。
为了检查它,我将它与它联系起来-lefence
,它给了我 SIGSEGV。在花了很多时间找出问题所在之后,我终于决定在库中搜索错误,即使它的功能非常简单。
作为测试,我尝试编译链接的测试单元-lefence
,我得到了 SIGSEGV。测试不会弄乱动态分配的内存,但在不同测试单元中成功的代码除外。
我还注意到该-pthread
标志将内存分配设置为已包装。gcc -dumpspecs | grep pthread
产生以下内容:
libefence 是否不支持多线程?
编辑:基本上我假设电子围栏库取代了常规 libc 的 malloc/free 调用。他们已经用线程安全的引擎盖包裹的事实是没有用的,因为他们已经用不可重入的东西再次包裹了。
c++ - 使用电子围栏的“地址不是来自 malloc()”的错误
我一直在编写一个测试用例程序来演示我的一个更大程序的问题,并且测试用例有一个原始程序没有的错误。
这是头文件:
这是实现文件:
我将此程序与电子围栏链接,当我运行它时,它会因以下错误而中止:
来自 gdb 的回溯显示非法指令位于编译器生成的析构函数中Pathfinder
,该析构函数在析构其 shared_ptr 时遇到问题。有人知道这是为什么吗?
c - 仅将 Electric Fence (libefence) 用于共享库
为了诊断一个棘手的内存损坏错误(内存被随机覆盖),我考虑使用 Electric Fence + 一些自定义 mprotect 调用来确保损坏的数据结构只有在我希望它们被写入时才可写(我立即得到尝试写入 SIGSEGV)。
不幸的是,上述代码是一个 Ruby C 扩展,这使得在 libefence 下运行它成为性能噩梦,就像在 libefence 下运行整个 ruby 解释器一样
非常慢。
OTOH,直接将 ruby 扩展与 libefence 链接(通过将 -lefence 传递给链接器)似乎没有任何效果,导致它在没有 libefence 的仪器的情况下运行。
有没有办法通过 libefence 只运行特定共享库中发生的内存分配,而让其他共享库和主进程单独运行?
debugging - 了解电围栏和gdb的输出
当调试一个以段错误终止的程序时,电栅栏与 gdb 一起返回:
"ElectricFence Exiting: mprotect() failed: Cannot allocate memory
[Thread 0xb0bd4b70 (LWP 5363) exited]
Program exited with code 0377.
我实际上认为电围栏会更有帮助。这是什么意思?我该如何解释这条信息?似乎没有任何堆栈可供我查看,或者至少bt
不会返回任何东西。
任何建议将不胜感激。
谢谢!
visual-studio - Valgrind 或 Electric Fence 未检测到堆损坏。我应该怀疑吗?(C++)
我最近遇到了与堆损坏的第一场战斗 (已解决) 。在我家里的 linux 机器上,罪魁祸首代码使用 valgrind 和电栅栏(使用 gdb)没有错误地退出。然而,在我们实验室的 Windows 机器上,我一直从我引用的帖子中描述的 VS 中获得与堆损坏相关的错误消息。
valgrind 和电栅栏没有检测到这样的问题是否令人惊讶(或至少不常见)?其他人在此处的答案中提到了一个可能与 valgrind 相似的错误。这些工具无法检测到此问题的原因可能是什么?是否有任何理由怀疑错误实际上是堆损坏?
更新:正如描述原始问题的帖子中所述,我发现问题是由于指向 std::vector 中的元素的指针,这变得很糟糕。用 std::list 替换向量(添加新元素时指针不会变为无效)解决了这个问题。所以回到我关于为什么 valgrind 没有检测到问题的问题,我问是否有任何关于如何避免未来类似情况的建议,即 valgrind 没有检测到的内存问题,这是我的一个最喜欢的工具。显然,更好地了解 STL 的工作原理将是一个好主意。也许我需要在我的编程等中对断言更加自信。
c++ - 在 C++ 程序中使用电围栏
我最近一直在试验 Electric Fence,但我不知道如何将它与 c++ 代码一起使用。
这是一个例子:
我用它编译了
而且我在开始时没有看到 Electric Fence 横幅,并且在可执行文件中找不到 EF 符号(使用 nm 命令)。
但是,如果我像这样修改程序:
一切都很好——EF 出现了。我知道它有点解决问题,我知道:)。我只是想了解为什么它一开始就不起作用,因为new()
应该调用malloc()
和delete()
调用free()
,不是吗?
我进入这个项目的原因是一个使用boost库和其他几个库的大项目。而且这个程序从不调用malloc()
或free()
直接调用。当我用 EF 构建它时,我不仅将 EF 链接到最终的可执行文件,而且重建了所有试图将 EF 链接到它们的库。而且我在其中任何一个中都找不到 EF 符号。这是正确的方法吗?或者是错误的,EF 最终应该只链接到可执行文件,库应该保持不变?但是我再次在可执行文件中找不到 EF 符号。
debugging - malloc中的电子围栏段错误
我有一个相当复杂的程序,它进行了大量的内存分配,今天令人惊讶的是,它以一种 gdb 无法精确定位的奇怪方式开始出现段错误。怀疑某处内存损坏,我将它与 Electric Fence 联系起来,但我对它告诉我的内容感到困惑:
我正在调用值为 36 的 malloc,所以我很确定这应该不是问题。
我不明白的是,我什至有可能在 malloc 中破坏堆。在阅读手册页多一点时,似乎我正在写入一个空闲页面,或者我正在承保一个缓冲区。所以,我尝试了以下环境变量,一起和自己:
最后两个完全没有效果。
第一个更改了我的程序中的堆栈帧部分(当 malloc 被致命调用时,我的程序正在执行该部分),但是一旦输入 malloc,就会具有相同的帧。
第二个变化更大;除了在我的程序的不同位置发生崩溃之外,它还发生在对 realloc 而不是 malloc 的调用中,尽管 realloc 是直接调用 malloc ,否则回溯与上面相同。
除了栅栏,我没有明确链接到任何其他库。
更新:我发现几个地方提示消息:“mprotect() failed: Cannot allocate memory”意味着机器上没有足够的内存。但我没有看到“无法分配内存”部分,ps 说我只使用了 15% 的内存。如此小的分配(4k + 32)真的会是问题吗?
segmentation-fault - 使用电子围栏时的Openmpi segfault
我试图在我的一个使用电围栏的程序中找到一些内存错误。我的程序使用 OpenMPI,当我尝试运行它时,它会出现以下回溯:
我的代码的相关部分是:
我不确定为什么 __memcpy_ssse3_back 会导致段错误。当我在没有电围栏的情况下运行时,这部分程序不会出现段错误。有谁知道发生了什么?我正在使用 openmpi 版本 1.4.3
c++ - 为什么电子围栏/Valgrind 无法捕捉到这个缓冲区溢出问题?
我创建了一个有问题的程序 - buggy.c - 这是缓冲区 t 的缓冲区溢出场景。您可以看到我正在编写超过 5 个索引。它工作正常。它永远不会给我一个错误。我想知道,为什么会这样?我什至尝试了 Valgrind,这也找不到这个问题。你能告诉我这里有什么问题吗?
但是,我没有遇到任何崩溃。这里没有电围栏的影响。我错过了什么?我看到这里发布的类似问题gcc withelectric fence library does not take effect,但似乎还没有答案。我在 FC19 上运行这个例子。有人有答案吗?甚至 valgrind 都无法检测到问题?有没有其他工具可以检测这些问题?
根据进一步的评论,我修改了缓冲区溢出功能以被 Electric Fence 检测到。但是,电子围栏无法检测到该问题。这是修改后的功能。
Electric Fence 没有检测到错误,但 Valgrind 至少显示了它。
c++ - Electric Fence - Cross 为 MIPS 编译是否有任何内存对齐问题?
我正在尝试在我的嵌入式盒子上使用 Electric Fence - 基于 MIPS。当我运行一个简单的应用程序时 - 它似乎很好。当我在一个实际的应用程序上运行时——一个试图使用一切的复杂应用程序——从 dbus 到 sqlite。我得到一个崩溃分段错误 - 一个想要的。当我尝试 gdb it 时,我收到以下错误。这是一个自由问题还是它是什么?我无法更进一步。请记住,我的应用程序是 C/C++、Javascript 的融合。