我真的很喜欢FlameGraph的想法用于分析,因为它将有助于消除不需要的函数调用。但是有一个问题,它要求探查器在每次收集样本时都执行完整的堆栈转储。这可以使用DTrace或SystemTap很容易地完成,但我需要能够在运行ubuntu(消除DTrace)的ARM设备上执行此操作。我也想在不重新编译内核的情况下执行此操作(这消除了SystemTap)。是否有可能让Valgrind/Callgrind或OProfile(或其他一些可以在Ubuntu中的ARM设备上运行的分析工具)输出类似于:dtrace-n'profile-1001/pid==12345&&arg1/{@[ustack(
我有一个程序:#includeintcall(){intx=25;++x;returnx;}intmain(){intp;p=call();printf("%d",p);return0;}当我使用-g选项编译程序并使用valgrind运行它时,它显示:==15469==1errorsincontext1of8:==15469==Conditionaljumpormovedependsonuninitialisedvalue(s)==15469==at0x546F83:_dl_relocate_object(in/lib/ld-2.12.90.so)==15469==by0x53E6CC
我有一个程序:#includeintcall(){intx=25;++x;returnx;}intmain(){intp;p=call();printf("%d",p);return0;}当我使用-g选项编译程序并使用valgrind运行它时,它显示:==15469==1errorsincontext1of8:==15469==Conditionaljumpormovedependsonuninitialisedvalue(s)==15469==at0x546F83:_dl_relocate_object(in/lib/ld-2.12.90.so)==15469==by0x53E6CC
我正在做一个项目,我需要找到在给定特定输入的各种Linux程序(用C编写)中调用了哪些函数。我目前的方法是使用-pg(分析选项)编译一个程序,运行它,然后通过处理gprof的输出找到调用了哪些函数。只有至少被调用一次的函数才会出现在输出文件中。明显的问题是只有一个进程可以写入gprof输出文件。如果程序fork多个进程,我不会从其他进程获得任何分析输出。有没有办法让gprof为每个进程(可能用pid标记)生成一个输出文件?该手册建议将每个进程更改为不同的目录,但我不想修改源代码来执行此操作。是否有其他适用于Linux的工具可以提供帮助? 最佳答案
我正在做一个项目,我需要找到在给定特定输入的各种Linux程序(用C编写)中调用了哪些函数。我目前的方法是使用-pg(分析选项)编译一个程序,运行它,然后通过处理gprof的输出找到调用了哪些函数。只有至少被调用一次的函数才会出现在输出文件中。明显的问题是只有一个进程可以写入gprof输出文件。如果程序fork多个进程,我不会从其他进程获得任何分析输出。有没有办法让gprof为每个进程(可能用pid标记)生成一个输出文件?该手册建议将每个进程更改为不同的目录,但我不想修改源代码来执行此操作。是否有其他适用于Linux的工具可以提供帮助? 最佳答案
在运行Valgrind的memcheck工具时,我经常会收到数十万(或更多,因为Valgrind在100K时截止)的小的无效读取语句,例如:==32027==Invalidreadofsize1==32027==at0x3AB426E26A:_IO_default_xsputn(in/lib64/libc-2.5.so)==32027==by0x3AB426CF70:_IO_file_xsputn@@GLIBC_2.2.5(in/lib64/libc-2.5.so)==32027==by0x3AB42621FA:fwrite(in/lib64/libc-2.5.so)==32027==
在运行Valgrind的memcheck工具时,我经常会收到数十万(或更多,因为Valgrind在100K时截止)的小的无效读取语句,例如:==32027==Invalidreadofsize1==32027==at0x3AB426E26A:_IO_default_xsputn(in/lib64/libc-2.5.so)==32027==by0x3AB426CF70:_IO_file_xsputn@@GLIBC_2.2.5(in/lib64/libc-2.5.so)==32027==by0x3AB42621FA:fwrite(in/lib64/libc-2.5.so)==32027==
我正在尝试测量Linux上一个进程(一个Java程序)的内存使用情况,并且有两个与之相关的问题:我尝试使用脚本ps_mem.py(来自/proc/$PID/smaps的总和值)总内存使用量的峰值约为135MB(私有(private)和共享内存)。共享内存量小于1MB。尝试将Valgrind与massif工具一起使用valgrind--tool=massif--trace-children=yes--stacks=yesjavamyProgram在内存使用高峰时产生大约10MB。现在我的理解是,堆是我程序的变量存放的地方,是不是说这两种方法的区别在于代码本身(包括jvm)占用的空间?如果
我正在尝试测量Linux上一个进程(一个Java程序)的内存使用情况,并且有两个与之相关的问题:我尝试使用脚本ps_mem.py(来自/proc/$PID/smaps的总和值)总内存使用量的峰值约为135MB(私有(private)和共享内存)。共享内存量小于1MB。尝试将Valgrind与massif工具一起使用valgrind--tool=massif--trace-children=yes--stacks=yesjavamyProgram在内存使用高峰时产生大约10MB。现在我的理解是,堆是我程序的变量存放的地方,是不是说这两种方法的区别在于代码本身(包括jvm)占用的空间?如果
valgrind正在报告来自如下代码的未初始化内存错误:unsignedcharbuf[100];structdriver_commandcmd;cmd.len=sizeof(buf);cmd.buf=buf;ioctl(my_driver_fd,READ,&cmd);for(i=0;i如果我在调用驱动程序之前memset()buf,错误就会消失。valgrind能否检测linux驱动程序是否正确写入缓冲区?(我查看了驱动程序代码,它似乎是正确的,但也许我遗漏了什么。)还是它只是通过了驱动程序调用而无法知道缓冲区已写入内核?谢谢。 最佳答案