我试图用Valgrind来拦截一个函数,根据他们的例子 。 使用gcc构build时,我能够完成全局函数的拦截,但是当我用g ++编译相同的代码时,拦截不起作用。 在我应该指定的编译器标志中有什么特别的? 这是我的示例应用程序: #include <stdio.h> #include "valgrind.h" __attribute__ ((noinline)) void foo() { printf("inside foo\n"); } void I_WRAP_SONAME_FNNAME_ZU(NONE,foo)() { OrigFn fn; VALGRIND_GET_ORIG_FN(fn); printf("*** Before foo()\n"); CALL_FN_v_v(fn); printf("*** After foo()\n"); } int main() { foo(); return 0; } 当用GCC编译时,输出是: *** Before foo() inside foo *** After foo() 但是,当用g ++编译时,输出很简单 在里面
我试图运行我的程序,这需要一个库在LD_PRELOAD环境variables,valgrind。 当我这样做时,我得到以下错误: ERROR: ld.so: object '/path/to/lib/libLIBRARY.so' from LD_PRELOAD cannot be preloaded: ignored. 但是,如果我要在没有 valgrind的情况下运行程序,那么它很乐意使用LD_PRELOAD ed库。 这是为什么? 有没有办法解决这个问题? (PS系统是64位科学的linux 5,我相信)
Valgrind是否有可能在不终止程序的情况下检测到可达/内存泄漏? 也就是说,退出程序之前如何知道结果呢?
我正在C ++上用pthreads在linux上制作一个web服务器。 我用valgrindtesting了泄漏和内存问题 – 所有问题都修复了。 我用helgrindtesting了线程问题 – 全部修复。 我正在试压力testing 。 当probr用helgrind运行时,我遇到了问题 valgrind –tool=helgrind ./chats 它只是在随机的地方死亡,就像我杀死它时所做的那样。 我有时从helgrind得到的唯一的报告是,程序存在,但仍然持有一些锁,这是正常的时候被杀死。 检查泄漏时: valgrind –leak-check=full ./chats 它更稳定,但我设法使其死亡一次数百个并发连接。 我试着单独运行程序,不能让它崩溃。 我尝试了250个并发连接。 每个线程延迟100毫秒,以便更容易在同一时间有多个连接。 没有崩溃。 在任何情况下,线程和连接都不会超过10,即使有2个连接,我也会看到它崩溃,但从来没有同时只有一个连接(包括主线程和一个辅助线程共3个)。 这个问题有可能只在用helgrind运行的时候才会发生,或者只是helgrind使它更容易显示? 什么原因程序被杀死(内核?)分配太多的内存,太多的文件描述符? 我testing了一下,发现只有在客户端超时并closures连接时才会死掉。 所以这里是检测客户端closures套接字的代码: void *TcpClient::run(){ int ret; struct timeval tv; char * buff = (char *)malloc(10001); int br; colorPrintf(TC_GREEN, "new client starting: %d\n", sockFd); while(isRunning()){ tv.tv_sec = 0; […]
我有以下代码在fork中执行非有效的命令。 下面的代码在valgrind中返回一个内存泄漏。 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdarg.h> #include <errno.h> #include <unistd.h> int external_cmd(char **argv) { int pid; if ((pid = fork()) == -1) return -1; if (pid == 0) { /* child */ execvp(argv[0], argv); exit(0); } else if (pid < 0) return -1; int status; while (wait(&status) != pid); return 0; […]
看我有一个程序 #include <stdio.h> int call(){ int x=25; ++x; return x; } int main(){ int ptr; ptr=call(); printf("%d",ptr); return 0; } 当我用-g选项编译它并显示它与valgrind运行 ==15469== 1 errors in context 1 of 8: ==15469== Conditional jump or move depends on uninitialised value(s) ==15469== at 0x546F83: _dl_relocate_object (in /lib/ld-2.12.90.so) ==15469== by 0x53E6CC: dl_main (in /lib/ld-2.12.90.so) ==15469== by 0x55094D: _dl_sysdep_start (in […]
运行Valgrind的memcheck工具时,我经常会得到几十万(或更多,因为Valgrind在100K切断)小的无效读取语句,例如: ==32027== Invalid read of size 1 ==32027== at 0x3AB426E26A: _IO_default_xsputn (in /lib64/libc-2.5.so) ==32027== by 0x3AB426CF70: _IO_file_xsputn@@GLIBC_2.2.5 (in /lib64/libc-2.5.so) ==32027== by 0x3AB42621FA: fwrite (in /lib64/libc-2.5.so) ==32027== by 0x4018CA: STARCH_gzip_deflate (in /home/areynolds/trunk/utility/applications/bed/starch/bin/starch) ==32027== by 0x401F48: compressFileWithGzip (in /home/areynolds/trunk/utility/applications/bed/starch/bin/starch) ==32027== by 0x4028B5: transformInput (in /home/areynolds/trunk/utility/applications/bed/starch/bin/starch) ==32027== by 0x402F12: main (in /home/areynolds/trunk/utility/applications/bed/starch/bin/starch) ==32027== Address 0x7febb9b3c is on thread […]
我试图测量一个进程(一个Java程序)在Linux上的内存使用情况,并有两个相关的问题: 我尝试使用脚本ps_mem.py (从/ proc / $ PID / smaps总结值),总内存使用率的峰值大约是135MB(私有和共享内存)。 共享内存量小于1MB。 尝试使用Valgrind与山体工具valgrind –tool=massif –trace-children=yes –stacks=yes java myProgram在内存使用高峰时产生大约10MB。 现在,据我了解,堆是我的程序的variables存储的地方,这是否意味着这两个方法之间的区别是代码本身(包括jvm)所占用的空间? 如果同一程序在不同的机器上使用不同数量的内存,或者使用不同的处理器(ARM或x86),它们的内存是不同的吗?
valgrind从这样的代码报告未初始化的内存错误: unsigned char buf[100]; struct driver_command cmd; cmd.len = sizeof(buf); cmd.buf = buf; ioctl(my_driver_fd, READ, &cmd); for(i = 0; i < sizeof(buf); i++) { foo(buf[i]); /* <<— uninit use error from valgrind */ } 如果我在驱动程序调用之前memset()buf错误消失。 valgrind可以检测linux驱动程序是否正确写入缓冲区? (我看着驱动程序代码,似乎是正确的,但也许我错过了一些东西。) 还是只是通过驱动程序调用,并无法知道缓冲区已经写入内核? 谢谢。
在我的C程序中,我使用malloc()分配内存,与calloc() ,它不初始化内存,它可能仍然包含垃圾。 大多数情况下,在分配的上下文中,我不会对malloc()分配的内存进行任何更改。 (例如,在初始化包含缓冲区的结构的函数中,我不会更改缓冲区的内存,但稍后会进行更改)。 Valgrind给了我很多错误: 条件跳转或移动取决于未初始化的值(s) 使用大小为4的未初始化的值 我肯定永远不会从这些情况下未初始化的内存中读取。 我应该忽略它们还是更好地初始化分配内存? 万一我应该忽略它们,我怎样才能在Valgrind中closures这个错误信息呢? 例1 : ==4253== Conditional jump or move depends on uninitialised value(s) ==4253== at 0x408EB8E: vfprintf (vfprintf.c:1624) ==4253== by 0x4093C2E: printf (printf.c:35) ==4253== by 0x40624D2: (below main) (libc-start.c:226) ==4253== Uninitialised value was created by a heap allocation ==4253== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==4253== by 0x8048938: […]