问题标签 [glibc]

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.

0 投票
2 回答
2040 浏览

c++ - boost::function free() 上的“损坏的双链表”

我将尝试在不提供太多源代码的情况下提出这个问题,因为所有相关位加起来就是一堆。涉及的关键(我认为?)对象是

boost::function mf1 用作最小化例程(o2scl::ool_mmin_spg)的回调函数,但我认为我遇到的问题不是特定于此。该代码通过调用 ool_mmin_spg.mmin() 函数运行,该函数使用 mf1 作为回调并且似乎运行没有错误。然后我收到这个可爱的信息

* 检测到 glibc * ./test: 损坏的双链表: 0x0000000001e9fb20 ***

其次是回溯和内存映射。回溯的相关行似乎是


#7 0x000000000041d32a in boost::detail::function::functor_manager, o2scl::ovector_const_subvector_tlate >, MSMTFormation>, unsigned long, o2scl::ovector_base_tlate const&, double&, dmect::MSMTModel, o2scl::ovector_const_subvector_tlate >&>, boost: :_bi::list5, o2scl::ovector_const_subvector_tlate >, MSMTFormation> >, boost::arg<1>, boost::arg<2>, boost::arg<3>, boost::arg<4> > > > ::manage (in_buffer=, out_buffer=warning: (内部错误: pc 0x41d270 在 psymtab 中读取,但不在 symtab 中。)


我推断从 boost::function 释放内存存在问题,但除此之外我迷路了。是否有任何关于尝试调试 glibc“损坏的双链表”错误的指示?我在谷歌上找到了一些参考资料,但似乎都解决了非常具体的问题。如果需要更详细的代码片段,请告诉我,感谢您的宝贵时间!

0 投票
3 回答
4016 浏览

hook - 使用 LD_PRELOAD 方法注入 printf 的问题

我在我的一个项目中破解了 glibc 的 printf() 并遇到了一些问题。你能提供一些线索吗?我关心的一个问题是为什么同样的 malloc/free 解决方案可以完美运行!

如附件所示,“PrintfHank.c”包含我自己的 printf() 解决方案,它将在标准库之前预加载;而“main.c”只是使用 printf() 输出一个句子。编辑两个文件后,我发出以下命令:

  1. 编译 main.c gcc –Wall –o main main.c
  2. 创建我自己的库 gcc –Wall –fPIC –shared –o PrintfHank.so PrintfHank.c –ldl
  3. 测试新库 LD_PRELOAD=”$mypath/PrintfHank.so” $mypath/main

但是我在控制台中收到了“hello world”而不是“within my own printf”。破解 malloc/free 函数时,没关系。

我以“root”身份登录系统并使用 2.6.23.1-42.fc8-i686。任何意见将不胜感激!!

主程序

PrintfHank.c

0 投票
4 回答
502 浏览

c++ - 关于C++内存分配和删除的问题

我遇到了一个严重的错误。当我在对象层次结构顶部的对象上调用 delete 时(希望导致其子对象的删除),我的程序退出,我得到了这个:

其次是看起来像是某种内存转储的东西。我已经搜索过这个错误,从我收集的信息来看,它似乎是在您尝试删除已删除的内存时发生的。不可能,因为我的代码中只有一个地方尝试删除。这是古怪的部分:它不会在调试模式下发生。有问题的代码:

p>

我已经注释掉了高度图析构函数中的所有内容,但仍然是这个错误。当错误发生时,

被打印。在调试模式下,我可以慢慢地单步执行代码

已打印,并且没有错误。如果我注释掉“删除高度图;” 行,永远不会发生错误。上面的析构函数是从另一个析构函数调用的(单独的类,没有虚拟析构函数或类似的东西)。高度图指针在这样的方法中是新的:

p>

这可能与返回在静态方法的堆栈空间中初始化的指针有关吗?我正确地删除了吗?关于我可以检查或做得更好的任何其他提示?

0 投票
1 回答
6156 浏览

sockets - 为什么 inet_ntoa 被设计为不可重入函数?

浏览 GNU C 库的源代码,我发现 inet_ntoa 是用

我的问题是,既然需要使用可重入的inet_ntoa,为什么GNU C库的作者不使用malloc来实现呢?

谢谢。

0 投票
10 回答
60558 浏览

c - GCC 中 strlen() 的实现在哪里?

谁能指出我strlen()在 GCC 中的定义?我已经发布 4.4.2 版大约半小时了(同时谷歌搜索疯狂),我似乎无法找到strlen()实际实施的位置。

0 投票
4 回答
634 浏览

c - C 函数返回 gchar 的问题**

我有一个定义如下的函数(在 C 中):

我正在尝试向 switch 语句添加一个新条件,例如

它将返回 &FileTag->artist 的第一个字符。

我已经搜索了所有互联网寻找解决方案,但空手而归。有人有想法么?

更新: 如果有帮助,此功能是应用程序 EasyTag 的一部分。从我看到的代码来看,这是确定easytag文件排序功能的新文件名的地方。我正在尝试添加一个新变量以允许应用程序将音乐排序到如下目录中:<First letter of artist name>/<Artist>/<Album>/<Tracks>

我总是有可能正在查看错误的功能,但据我所知,我是。

另一个更新: 我让这个函数按我的意愿工作(指针是有趣的小东西),但它并没有像下面指出的那样做我所期望的。感谢所有的帮助和耐心!

0 投票
9 回答
15713 浏览

c - printf 减慢了我的程序

我有一个小的 C 程序来计算哈希(用于哈希表)。我希望代码看起来很干净,但是有一些与它无关的东西困扰着我。

我可以在大约 0.2-0.3 秒内轻松生成大约一百万个哈希(以 /usr/bin/time 为基准)。但是,当我在 for 循环中对它们进行 printf() 处理时,程序会减慢到大约 5 秒。

  1. 为什么是这样?
  2. 如何让它更快?mmapp()ing 标准输出可能吗?
  3. stdlibc 在这方面是如何设计的,如何改进?
  4. 内核如何更好地支持它?需要如何修改它以使本地“文件”(套接字、管道等)的吞吐量真的很快?

我期待着有趣和详细的答复。谢谢。

PS:这是一个编译器构建工具集,所以不要害羞地进入细节。虽然这与问题本身无关,但我只想指出我感兴趣的细节。

附录

我正在寻找更多的解决方案和解释的程序化方法。确实,管道可以完成这项工作,但我无法控制“用户”的工作。

当然,我现在正在做一个测试,这是“普通用户”不会做的。但这并没有改变一个简单的 printf() 减慢进程的事实,这是我试图找到最佳编程解决方案的问题。


附录 - 惊人的结果

参考时间是针对 TTY 内的普通 printf() 调用,大约需要 4 分 20 秒。

在 /dev/pts(例如 Konsole)下进行测试可将输出加速到大约 5 秒。

在我的测试代码中使用 setbuffer() 到大小为 16384 所需的时间大致相同,对于 8192 几乎相同:大约 6 秒。

setbuffer()在使用时显然没有效果:它需要相同的时间(在 TTY 上大约 4 分钟,在 PTS 上大约 5 秒)。

令人惊讶的是,如果我在 TTY1 上开始测试然后切换到另一个 TTY上,它确实需要与 PTS 上相同的时间:大约 5 秒。

结论:内核做了一些与可访问性和用户友好性有关的事情。嗯!

通常,无论您是在 TTY 处于活动状态时盯着它看,还是切换到另一个 TTY,它都应该同样慢。


教训:运行输出密集型程序时,切换到另一个 TTY!

0 投票
3 回答
60504 浏览

gcc - 未找到 GLIBCXX_3.4.9

我有一个关于libstdc++.so.

我安装了新版本的 gcc 并尝试编译 C++ 代码。编译工作,但是当我尝试执行二进制文件(m5.opt是它的名字)时,我得到了以下错误:

我需要更换libstdc++.so吗?如果是这样,我在哪里可以下载我想要的版本?在 GCC 网站上,他们说 libstdc++ 现在是 gcc 的一部分。

细节

GCC:我之前有 gcc 4.1.2,但我下载了 gcc 4.2.4。从我执行的未解压的 gcc 目录中./configure;制作; 须藤使安装`。当我尝试使用 gcc 或 g++ 编译时,它的默认版本仍然是 4.1.2。为了克服这个问题,我替换了一些链接:

GLIBC(++) -- libstdc++:

Linux版本: uname -a给出:

Linux madmax 2.6.18-128.4.1.el5 #1 SMP Tue Aug 4 12:51:10 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux

0 投票
1 回答
1593 浏览

linux - 有谁知道是否有人集成了 libsegfault.so 和 gdbserver 以便将 gdb 即时附加到崩溃的程序?

之前在http://sourceware.org/ml/gdb/2007-06/msg00360.html中提到过。
但似乎没有人真正实施过这种想法。
实现这一点有什么障碍吗?

我的要求如下:

  1. 能够插入任何 elf 二进制可执行文件(例如,使用 LD_PRELOAD)
  2. 二进制文件可能是多线程可执行文件
  3. 二进制文件可能链接到包含 main 函数的库
  4. 这应该适用于 x86 以外的各种 cpu 架构(至少 MIPS、ARM、PPC)

所以如果已经有这样的解决方案,我想要一个链接,但如果还没有,我想知道为什么它还没有作为轮子实现。
可能只是没有人不需要它......但我认为这对于准备作为标准非常有用。

除了将代码放在一起之外,还需要任何技术或政治问题。

0 投票
4 回答
10047 浏览

c - 以线程安全的方式使用 glibc malloc 钩子

我想通过使用 malloc 和 free 挂钩来监控应用程序中 malloc 和 free 的使用。

这是文档http://www.gnu.org/s/libc/manual/html_node/Hooks-for-Malloc.html

从示例页面中,您可以看到my_malloc_hook在重新调用 malloc 之前暂时关闭 malloc 挂钩(或切换到链中的前一个挂钩)。

这是监控多线程应用程序时的一个问题(请参阅问题末尾的解释)。

我在网上找到的其他使用 malloc 钩子的例子也有同样的问题。

有没有办法重新编写此函数以在多线程应用程序中正常工作?

例如,是否有一个内部 libc 函数可供 malloc 钩子调用来完成分配,而无需停用我的钩子。

由于公司法律政策,我无法查看 libc 源代码,因此答案可能很明显。

我的设计规范说我不能用不同的 malloc 设计替换 malloc。

我可以假设没有其他钩子在起作用。


更新

由于在服务 malloc 时 malloc 钩子被暂时删除,另一个线程可能会调用 malloc 并没有得到钩子。

有人建议 malloc 在它周围有一个大锁来防止这种情况发生,但它没有记录在案,而且我有效地递归调用 malloc 的事实表明任何锁必须在钩子之后存在,或者非常聪明: