相关疑难解决方法(0)

为malloc创建一个包装函数,在C中创建free

我试图创建一个包装函数free,并malloc用C来帮助通知我的内存泄漏.有谁知道什么时候我打电话怎么这么声明这些功能malloc()free()它会调用我的自定义功能,而不是标准的lib功能?

c malloc memory-leaks memory-management

38
推荐指数
6
解决办法
4万
查看次数

推送时发生Git错误:无法预加载LD_PRELOAD中的对象

这有些事情刚刚开始发生,虽然我不知道我能做些什么来触发它.

每当我运行时,git push我都会收到以下错误:

ERROR: ld.so: object '/lib/liblm.so' from LD_PRELOAD cannot be preloaded: ignored.
Run Code Online (Sandbox Code Playgroud)

推送确实在此之后进行并且正常工作.

我已经更新到最新版本的Git(通过自制软件)并且没有解决它.

编辑:道歉,我不是很清楚我究竟在问什么.我想我的问题有两个:

  • 出于兴趣,导致错误的原因是什么?
  • 如何修复错误以免错误消失?它似乎没有引起我能看到的任何问题,但它有点刺激!

git

33
推荐指数
1
解决办法
1万
查看次数

-fPIC标志可以增加多少开销?

我正在测试一个计算Mandelbrot分形的简单代码.我一直在检查它的性能,具体取决于函数中的迭代次数,它检查一个点是否属于Mandelbrot集.令人惊讶的是,在添加-fPIC旗帜后,我的时间差异很大.从我读到的开销通常可以忽略不计,我遇到的最高开销约为6%.我大约30%.任何建议将被认真考虑!

我的项目详情

我使用-O3标志,gcc 4.7.2,Ubuntu 12.04.2,x86_64.结果如下

    #iter     C (fPIC)  C       C/C(fPIC)
    1         0.01      0.01    1.00 
    100       0.04      0.03    0.75 
    200       0.06      0.04    0.67 
    500       0.15      0.1     0.67 
    1000      0.28      0.19    0.68
    2000      0.56      0.37    0.66 
    4000      1.11      0.72    0.65 
    8000      2.21      1.47    0.67
   16000      4.42      2.88    0.65 
   32000      8.8       5.77    0.66 
   64000      17.6      11.53   0.66

我使用的命令:

gcc -O3 -fPIC fractalMain.c fractal.c -o ffpic
gcc -O3 fractalMain.c fractal.c -o f
Run Code Online (Sandbox Code Playgroud)

代码:fractalMain.c

#include <time.h>
#include <stdio.h>
#include <stdbool.h> …
Run Code Online (Sandbox Code Playgroud)

c performance gcc

27
推荐指数
2
解决办法
6217
查看次数

如何在没有硬编码完整依赖路径的情况下构建共享库(.so)?

我需要构建两个第三方共享库,因此其他项目将重用其.so文件.但是,在构建之后,这些库中的一个包含到另一个库的硬编码路径.此路径在其他计算机上无效并导致链接器警告.如何防止将完整路径嵌入到生成的.so文件中?

细节:

第一个库源:~/dev/A
第二个库源:~/dev/B

它们都有configure生成make文件的脚本.图书馆B取决于A.所以,首先我建立A:

$ ~/dev/A/configure --prefix=~/dev/A-install
$ make && make install
Run Code Online (Sandbox Code Playgroud)

然后我建立B:

$ ~/dev/B/configure --prefix=~/dev/B-install --with-A=~/dev/A-install
$ make && make install
Run Code Online (Sandbox Code Playgroud)

然后,我要上传的内容~/dev/A-install~/dev/B-install我们的文件服务器,以便其他团队,并建立机可以使用的二进制文件.但是当他们尝试使用时,他们会收到链接器警告B:

/usr/bin/ld: warning: libA.so.2, needed by /.../deps/B/lib/libB.so, not found (try using -rpath or -rpath-link)
Run Code Online (Sandbox Code Playgroud)

当我运行ldd libB.so它时给出:

...
libA.so.2 => /home/alex/dev/A-install/lib/libA.so.2
Run Code Online (Sandbox Code Playgroud)

显然这条路径只存在于我的机器上,在其他机器上找不到.

如何从中删除完整的硬编码路径libB.so

谢谢.

c++ linker gcc shared-libraries

17
推荐指数
1
解决办法
1万
查看次数

为什么java应用程序在gdb中崩溃但在现实生活中正常运行?

尝试从gdb运行java应用程序导致segfault,但单独运行app却没有.这个应用程序是.JAR,它使用JOGL和一些内存映射来与GPU通信.

下面的Stacktrace暗示了某种内存访问问题,但我不明白它为什么会出现在GDB中而不是现实生活中.是否有一些环境因素gdb需要知道才能正确执行?

这个问题在JVM OpenJDK 6和7以及Oracle JRE 7之间仍然存在.在启用segfault之前,oracle JRE在启动时运行得更远.所有段错误在试验之间的发生和位置都是一致的.

Segfault在GPU和驱动程序之间持续存在(!!):nvidia,radeon,fglrx current和fglrx beta(14.xx).GDB将成功附加到已经运行的程序实例,但是gDEBugger似乎不可能这样做,这最终需要工作.

没有意图使用gdb进行实际调试.相反,我试图使用gDEBugger来执行OpenGL调试.gDEBugger显然依赖于GDB作为其后端的一部分,因此如果GDB失败,gDEBugger也会失败.这导致尝试单独运行gdb以隔离问题.

gDEBugger output:
GDB String:  [Thread debugging using libthread_db enabled]  
GDB String:  Using host libthread_db library  /lib/x86_64-linux-gnu/libthread_db.so.1 .  
Thread Created: 140737353893632 (LWP: 3265)
Thread Created: 140737294624512 (LWP: 3266)
Thread Created: 140737293571840 (LWP: 3267)
Thread Created: 140737292519168 (LWP: 3268)
Thread Created: 140737155180288 (LWP: 3269)
Thread Created: 140737154127616 (LWP: 3270)
Thread Created: 140736913602304 (LWP: 3271)
Thread Created: 140736909629184 (LWP: 3272)
Thread Created: 140736908576512 (LWP: 3273)
Thread Created: …
Run Code Online (Sandbox Code Playgroud)

java opengl gdb jogl segmentation-fault

17
推荐指数
1
解决办法
2865
查看次数

我怎么能拦截linux sys调用?

除了LD_PRELOAD技巧,以及用你提供的系统调用取代某个系统调用的Linux内核模块之外,是否有可能拦截一个系统调用(例如打开),以便在它到达实际打开之前首先通过你的函数?

c linux hook redirect system-calls

14
推荐指数
5
解决办法
2万
查看次数

如何在垃圾收集时确保Python"零"内存?

我遇到了与bytesPython3.2 相关的内存管理问题.在某些情况下,ob_sval缓冲区似乎包含我无法解释的内存.

对于特定的安全应用程序,我需要能够确保内存"归零"并在不再使用后尽快返回给操作系统.由于重新编译Python实际上不是一个选项,我正在编写一个可以与LD_PRELOAD一起使用的模块:

  • 通过更换禁用内存池PyObject_MallocPyMem_Malloc,PyObject_ReallocPyMem_Realloc,并PyObject_FreePyMem_Free(例如:你会得到什么,如果你没有编译WITH_PYMALLOC).我不在乎记忆是否合并,但这似乎是最简单的方法.
  • 包装malloc,realloc以及free跟踪请求的内存量以及发布时的memset所有内容0.

粗略地看一下,这种方法似乎很有效:

>>> from ctypes import string_at
>>> from sys import getsizeof
>>> from binascii import hexlify
>>> a = b"Hello, World!"; addr = id(a); size = getsizeof(a)
>>> print(string_at(addr, size))
b'\x01\x00\x00\x00\xd4j\xb2x\r\x00\x00\x00<J\xf6\x0eHello, World!\x00'
>>> del a
>>> print(string_at(addr, size))
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00'
Run Code Online (Sandbox Code Playgroud)

最后的错误\x13是奇怪的,但不是来自我的原始值,所以起初我认为它没关系.我很快找到了不太好的例子:

>>> a = …
Run Code Online (Sandbox Code Playgroud)

python memory memory-pool

14
推荐指数
2
解决办法
1013
查看次数

如何限制使用`malloc()`获取的内存而不限制堆栈?

我试图阻止学生代码在分配中运行,并拖延我的测试机器.我试过了

setrlimit(RLIMIT_DATA, r);
Run Code Online (Sandbox Code Playgroud)

哪个r是持有限制的结构.但不幸的是,虽然这个限制停止brk并且sbrk分配,但是C库只是故障转移mmap并保持正确分配.

我也试过了

setrlimit(RLIMIT_AS, r)
Run Code Online (Sandbox Code Playgroud)

并且这会使进程停止,但是这种补救措施太严重了 - 进程无法从ENOMEM错误中恢复,因为代码在遇到NULL返回的值时所进行的调用没有堆栈空间malloc().

我对二进制文件的控制有限,所以如果可以用系统调用,我宁愿这样做.但我需要一些方法来限制分配,而不会破坏流程的恢复能力.有没有人有建议?

更新:我找到了一个名为failmalloc的东西,但它不是很复杂,虽然我可以导致它失败,但我总是遇到gdb无法诊断的段错误.

进一步更新:我发现setrlimit(RLIMIT_AS, r) 似乎做我想要的工作,至少在被不相关的模块中发生的故障之后引起了某些情况下,该段错误.除非有人想出一些有趣的东西(或保留问题的理由),否则我可能会删除这个问题.

c malloc setrlimit

12
推荐指数
2
解决办法
1202
查看次数

如何将目标文件"链接"到可执行/编译二进制文件?

问题

我希望将一个目标文件注入现有的二进制文件中.作为一个具体的例子,考虑一个来源Hello.c:

#include <stdlib.h>

int main(void)
{
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

它可以编译为名为Hellothrough 的可执行文件gcc -std=gnu99 -Wall Hello.c -o Hello.此外,现在考虑Embed.c:

func1(void)
{
}
Run Code Online (Sandbox Code Playgroud)

Embed.o可以从此创建目标文件gcc -c Embed.c.我的问题是如何将一般插入Embed.oHello以这样的方式使必要的位置进行,并适当ELF内部表(如符号表,PLT等)正确修补?


假设

可以假设要嵌入的目标文件已经静态链接其依赖关系.可以假设任何动态依赖项(例如C运行时)也存在于目标可执行文件中.


目前的尝试/想法

  • 使用libbfd从对象文件复制到节二进制.我对此所取得的进展是,我可以使用原始二进制文件中的部分和目标文件中的部分创建一个新对象.问题是,由于目标文件是可重定位的,因此无法在不先执行重定位的情况下将其部分正确复制到输出.
  • 将二进制文件转换回目标文件并重新链接ld.到目前为止,我尝试使用objcopy来执行转换objcopy --input elf64-x86-64 --output elf64-x86-64 Hello Hello.o.显然这不符合我的意图,因为那样ld -o Hello2 Embed.o Hello.o会导致ld: error: Hello.o: unsupported ELF file type 2.我想这应该是预期的,因为Hello它不是一个目标文件.
  • 找到执行此类插入的现有工具?

理由(可选阅读)

我正在制作一个静态可执行编辑器,其目的是允许将任意用户定义的例程检测到现有的二进制文件中.这将分两步进行:

  1. 将对象文件(包含用户定义的例程)注入二进制文件.这是一个必需的步骤,不能通过注入共享对象等替代方法来解决. …

c linux linker

12
推荐指数
2
解决办法
1万
查看次数

运行ptrace时偶尔会丢失PTRACE_EVENT_VFORK

对不起,我无法发布代码来重现这个.我的问题正是我不知道如何调试这个问题.

我正在使用ptrace PTRACE_O_TRACEFORK | PTRACE_O_TRACEEXEC | PTRACE_O_TRACEVFORK | PTRACE_O_TRACEVFORKDONE | PTRACE_O_TRACECLONE跟踪一个进程,它是孩子(和孩子们的孩子).机制很像strace,但目的略有不同,因为我只是跟踪读取或修改的文件.

我的代码(用C编写)在x86-64架构上的Debian wheezy和Debian jessie上运行良好(在i386上也经过了较少的测试).当我尝试在Ubuntu Precise x86-64虚拟机(使用3.2.0内核)上编译和运行时,我遇到了麻烦.

在Precise机器上,我有时发现PTRACE_EVENT_VFORKvfork呼叫发生后我没有立即收到,而是开始接收事件(几个SIGSTOP事件和一些系统调用)而没有得到PTRACE_EVENT_VFORK事件.我没有看到正在执行的系统调用中有任何可疑的行为,并且行为是不可预测的.

我不知道该尝试将其减少到最小的错误情况,我真的不知道可能出现什么问题,从未见过这种丢失事件的行为.可以想象,差异不是内核,而是我正在跟踪的构建工具(这是python + gcc的组合).

有什么建议?

c linux ptrace

12
推荐指数
1
解决办法
296
查看次数