gpt4 book ai didi

c - 分析由 Ruby 程序调用的 C 共享库

转载 作者:数据小太阳 更新时间:2023-10-29 08:06:28 25 4
gpt4 key购买 nike

我有一个用 Ruby 和 C 编写的程序。C 部分是一个共享库,它是 Ruby 程序的扩展。我想使用 gprof 分析我编写的 C 共享库。我这样编译共享库:

gcc -I. -I/usr/lib/ruby/1.8/i486-linux -I/usr/lib/ruby/1.8/i486-linux -I. -D_FILE_OFFSET_BITS=64  -fPIC -fno-strict-aliasing -g -march=i686 -O2 -ggdb -pg -fPIC -c extension.c
gcc -shared -o extension.so extension.o -L. -L/usr/lib -L. -Wl,-Bsymbolic-functions -rdynamic -Wl,-export-dynamic -lruby1.8 -lpthread -lrt -ldl -lcrypt -lm -lc

然后我执行加载此共享库的 ruby​​ 程序,我希望在当前目录中有一个 gmon.out 文件,但由于某种原因没有创建文件 gmon.out。我该怎么做?

我用谷歌搜索了这个但找不到满意的答案(有效)。

附言- 作为一种解决方法,我可以有一个扩展的修改版本,它是一个纯 C 程序(而不是作为共享库创建),我可以使用它来分析,但是维护同一个 C 扩展的两个版本变得很乏味(两者之间存在大量差异)。

我也尝试编写一个直接使用共享库的 C 程序。我立即在共享库初始化期间调用的 ruby​​ 库函数之一中遇到页面错误。我认为它真的很期待从 ruby​​ 程序加载,这可能在内部做一些魔术。

(gdb) bt
#0 0x0091556e in st_lookup () from /usr/lib/libruby1.8.so.1.8
#1 0x008e87c2 in rb_intern () from /usr/lib/libruby1.8.so.1.8
#2 0x008984a5 in rb_define_module () from /usr/lib/libruby1.8.so.1.8
#3 0x08048dd0 in Init_SimilarStr () at extension.c:542
#4 0x0804933e in main (argc=2, argv=0xbffff454) at extension.c:564

更新:没关系。我使用 #ifdef 编译出扩展的 Ruby 部分并获得配置文件。关闭。

最佳答案

我找到了 oprofile在这种情况下,它是比 gprof 更好的分析选择。 reports from oprofile更全面。我使用#ifndef PROFILE 从 C 扩展编译出导致段错误的 ruby​​ 部分(并非全部),并用非 ruby​​ 代码替换它们。我在扩展本身中编写了一个 main() 例程,以调用扩展中的函数。然后我设置了一个 makefile 来将扩展编译为定义了 PROFILE 的 C 程序。然后我installed oprofile on Ubuntu .编写了这个脚本。

#!/bin/bash
sudo opcontrol --reset
sudo opcontrol --start
./a.out Rome Damascus NewYork Delhi Bangalore
sudo opcontrol --shutdown
opreport -lt1

编译了我的程序,并执行了上面的脚本,它从“opreport”命令中给出了这样的输出:

...
...
Killing daemon.
warning: /no-vmlinux could not be found.
warning: [vdso] (tgid:10675 range:0x920000-0x921000) could not be found.
warning: [vdso] (tgid:1270 range:0xba1000-0xba2000) could not be found.
warning: [vdso] (tgid:1675 range:0x973000-0x974000) could not be found.
warning: [vdso] (tgid:1711 range:0x264000-0x265000) could not be found.
warning: [vdso] (tgid:1737 range:0x990000-0x991000) could not be found.
warning: [vdso] (tgid:2477 range:0xa53000-0xa54000) could not be found.
warning: [vdso] (tgid:5658 range:0x7ae000-0x7af000) could not be found.
CPU: Core Solo / Duo, speed 1000 MHz (estimated)
Counted CPU_CLK_UNHALTED events (Unhalted clock cycles) with a unit mask of 0x00 (Unhalted core cycles) count 100000
samples % app name symbol name
12731 32.8949 a.out levenshtein
11958 30.8976 a.out corpora_pass2
5231 13.5161 no-vmlinux /no-vmlinux
4021 10.3896 a.out corpora_pass1
1733 4.4778 libc-2.10.1.so /lib/tls/i686/cmov/libc-2.10.1.so
542 1.4004 ld-2.10.1.so /lib/ld-2.10.1.so
398 1.0284 a.out method_top_matches

就是这样:顶级消费者是函数 levenshtein()。我在这之后执行了另一个命令来生成反汇编的输出,其中注释了源代码和每行的执行计数/时间。这看起来像这样(计数/次数在每个执行行的左侧):

> opannotate --source --assembly ./a.out > report.as.handcoded.1
> cat report.as.handcoded.1

...
...
...
: __asm__ (
2 0.0069 : 804918a: mov -0x50(%ebp),%ecx
4 0.0137 : 804918d: mov -0x54(%ebp),%ebx
: 8049190: mov -0x4c(%ebp),%eax
12 0.0412 : 8049193: cmp %eax,%ecx
10 0.0344 : 8049195: cmovbe %ecx,%eax
8 0.0275 : 8049198: cmp %eax,%ebx
11 0.0378 : 804919a: cmovbe %ebx,%eax
16 0.0550 : 804919d: mov %eax,-0x4c(%ebp)
: "cmp %0, %2\n\t"
: "cmovbe %2, %0\n\t"
: : "+r"(a) :
: "%r"(b), "r"(c)
: );
: return a;
...
...
...

关于c - 分析由 Ruby 程序调用的 C 共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2047211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com