Tag: valgrind

Valgrind报告空C程序的未初始化值

我用gcc test.c或clang test.c编译了这个C程序: int main (void) { return 0; } valgrind ./a.out给了我这个: ==9232== Memcheck, a memory error detector ==9232== Copyright (C) 2002-2011, and GNU GPL’d, by Julian Seward et al. ==9232== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info ==9232== Command: ./a.out ==9232== ==9232== Conditional jump or move depends on uninitialised value(s) ==9232== […]

Valgrind在Mac OSX 10.8上显示空程序的内存泄漏

Valgrind使用brew安装。 #include #include int main() { return 0; } gcc -g -o hello hello.c valgrind –tool=memcheck –leak-check=yes ./hello

未初始化的值由堆栈分配创建

==13890== Conditional jump or move depends on uninitialised value(s) ==13890== at 0x4E7E4F1: vfprintf (vfprintf.c:1629) ==13890== by 0x4E878D8: printf (printf.c:35) ==13890== by 0x400729: main (001.c:30) ==13890== Uninitialised value was created by a stack allocation ==13890== at 0x400617: main (001.c:11) 引用的行: int limit = atoi(argv[1]); 我不知道如何解决它。 我试过在stackoverflow和谷歌搜索,但我找不到解决方案。 编辑: 这是完整代码的链接。

Valgrind:无效读取大小4 – > sigsegv,没有valgrind和视觉工作室工作正常

我已经实现了一种压缩算法(使用霍夫曼编码),它使用节点的优先级队列(我定义的结构)。 现在,当我在linux或visual studio中运行代码时,一切正常。 当我检查visual studio中的内存泄漏时,没有给出。 现在的问题是,当我使用valgrind分析我的程序时,它终止于信号11(sigsegv)。 遇到的第一个错误是方法delete min中的“无效读取大小4”。 之后的其他错误是:Adress在大小为453的块中释放0字节,无效写入大小4,无效释放,删除或重新分配。 任何人都可以给我一些关于我可能犯的错误的建议吗? 我一直在互联网上搜索几个小时,但找不到我做错了什么(特别是因为它在没有使用valgrind时才起作用)。 或者提示如何调试并找出导致读取错误的原因。 非常感谢! 这是代码,以防有人想要查看它,但我想这并不是那么容易潜入这个特定的代码。 我猜它与代码的优先级队列有关: 我做霍夫曼部分的部分 – >每次删除2个最小节点并将两者的总和作为一个节点添加。 while(queue->size > 1){ node* n1 = delete_min(queue); node* n2 = delete_min(queue); // all the errors are encountered in this call node* temp = (node*) calloc(sizeof(node),1); temp->amount = n1->amount + n2->amount; insert_node(queue,temp); n1->parent = temp; n2->parent = temp; […]

您如何从用户模式代码中一般性地检测缓存行关联性?

我正在为valgrind中的cachegrind / callgrind工具编写一个小补丁,它将使用完全通用的代码,CPU指令和缓存配置自动检测(现在只有x86 / x64自动配置,而其他架构不提供CPUID类型配置为非特权代码)。 此代码需要完全在非特权上下文中执行,即纯用户模式代码。 它还需要可以在非常不同的POSIX实现中移植,因此grokking / proc / cpuinfo不会这样做,因为我们的目标系统之一没有这样的东西。 检测CPU的频率,高速缓存的数量,它们的大小,甚至高速缓存行大小都可以使用100%通用POSIX代码完成,该代码没有任何特定于CPU的操作码(只是很多合理的假设,例如添加两个数字在一起,如果没有内存或寄存器依赖性停顿,可能会在一个周期内执行)。 这部分相当简单。 什么不是那么简单,为什么我问StackOverflow,是如何检测给定缓存的缓存行关联性? 关联性是缓存中可以包含来自主内存的给定缓存行的位数。 我可以看到可以检测到L1缓存关联,但L2缓存? 当然L1关联性会受到影响吗? 我很欣赏这可能是一个无法解决的问题。 但我把它扔到StackOverflow上,希望有人知道我不知道的事情。 请注意,如果我们在这里失败,我将简单地在四方的关联性默认值中进行硬编码,假设它不会对结果产生巨大影响。 谢谢, 尼尔

Valgrind对未经初始化的字节大吼大叫

Valgrind抛出了这个错误: ==11204== Syscall param write(buf) points to uninitialised byte(s) ==11204== at 0x4109033: write (in /lib/libc-2.13.so) ==11204== by 0x8049654: main (mmboxman.c:289) ==11204== Address 0xbe92f861 is on thread 1’s stack ==11204== 有什么问题? 我无法找到它正在大喊大叫的未初始化的字节。 以下是犯罪行代码(提到的289行是调用函数lockUp的行): Request request; Response response; fillRequest(&request, MANADDUSER, getpid(), argument1, NULL, NULL, 0, 0); lockUp(&request, &response, NULL); 这里函数原型和结构声明: void fillRequest(Request *request, char code, pid_t pid, […]

我应该使用Helgrind还是DRD进行线程错误检测?

看起来Valgrind有两个工具都可以进行线程错误检测: Helgrind和DRD 。 这些工具基本相似。 我的主要问题是:我何时应该使用一个而不是另一个来检查我的multithreading代码? 更广泛地说,为什么有两种工具? 我认为它们并非完全多余。 有什么重要的区别? 我是否应该计划通过这两种工具运行我的代码?

为什么电栅栏/ Valgrind无法捕获这个缓冲区溢出问题?

我创建了一个错误的程序 – buggy.c – 这是缓冲区t的缓冲区溢出方案。 您可以看到我正在编写超过5个索引。 它工作正常。 它永远不会给我一个错误。 我在想,为什么会那样? 我甚至试过Valgrind,这也找不到这个问题。 你能告诉我这里有什么问题吗? void buffer_overflow(void) { int t[5]; int i = 0; for(i = 0; i<=7; i++) { t[i] = i; } /** this will cause buffer overflow **/ printf("Memory_overflow_completed\r\n"); } int main(int argc, char **argv) { buffer_overflow(); return 0; } $gcc -g buggy.c -o buggy.out -lefence […]

使用valgrind知道每个函数花费的时间(以秒为单位)

是否有valgrind的扩展,可以在命令窗口中使用,这将帮助我知道我的C代码中每个函数花费的时间(以秒为单位)? 谢谢=)

Valgrind是否存在已知的误报问题?

Valgrind是否有任何已知的误报? 我通过fmemopen函数得到’条件跳转或移动取决于未初始化的值’,用C语言编写并用GCC编译。 我能确定这是真的吗? 编辑:抑制文件中是否存在已知问题? 在程序中是否可以做一些事情,这不是真正的错误,但Valgrind会说它们是? 如果存在已知问题,列表会很好。