Tag: dtrace

libdtrace缓冲输出

我试图通过libdtrace使用dtrace(在Snow Leopard上; 10.6.4)。 我想在我自己的程序中捕获我的dtrace脚本的打印输出。 一种方法是将输出转到临时文件并从那里读取。 但是,libdtrace支持一个回调函数来直接捕获我更喜欢的输出。 我假设回调只会传递我可以使用的格式化字符串,但似乎并非如此。 例如,在下面的测试程序中,我希望打印输出为“process pid = 86138”。 但是,它始终打印出“process pid = 1”(当使用’dtrace -n’运行时,dtrace脚本正常工作)。 我究竟做错了什么 ? 我应该如何使用传递给缓冲区处理程序的数据? (具体来说,来自printf和tracemem动作的数据是我感兴趣的)。 #include #include #include #include #include #include #include #include #include static const char *g_prog = “pid86138::write:entry” “{” ” printf(\”process pid = %d\\n\”, pid);” “}”; static int dcmdbuffered(const dtrace_bufdata_t *bufdata, void *arg) { if((bufdata->dtbda_recdesc != NULL) && […]

自动assembly循环级别分析

有谁知道任何汇编循环级别分析器? 我一直在使用gprof,但gprof隐藏了循环,它是function级别的分析,但为了优化我的代码,我想要一些东西进入循环级别。 我想让它自动化,只需给我输出像gprof。 我被建议去dtrace但我不知道要开始。 无论如何,任何人都可以指导我吗? 例如 main: pushl %ebp movl %esp, %ebp subl $16, %esp movl $5000000, -4(%ebp) movl $0, -12(%ebp) movl $0, -8(%ebp) jmp .L2 .L3: movl -8(%ebp), %eax addl %eax, -12(%ebp) addl $1, -8(%ebp) .L2: movl -8(%ebp), %eax cmpl -4(%ebp), %eax jl .L3 movl $0, %eax leave ret 例如在gprof中它会说主执行1次而foo执行100次。 但我想知道L2或L3是否执行了1M次,那么我对优化的专注就在这里。 如果我的问题含糊不清,请让我解释一下谢谢