无法使用gprof配置libcrypto方法

时间:2016-04-05 14:57:45

标签: c gcc openssl gprof

我正在尝试分析使用openssl/libcrypto的某些方法的C程序。当我编译并运行代码而不分析信息时,一切都运行良好。当我添加选项以使用gprof对其进行分析时,我会从分析工具中获得意外结果。

我做了很多研究,但我找不到任何可以解决问题的页面。

这是我的代码(名为test.c):

#include <stdio.h>
#include <openssl/bn.h>
#include <openssl/rand.h>

static BIGNUM *x;
static BIGNUM *y;
static BIGNUM *z;
static BIGNUM *p;
static BN_CTX *tmp;
static unsigned int max_size;

int main(void){

  int max_bytes, res_gen;
  max_bytes  = 50;

  tmp = BN_CTX_new();
  BN_CTX_init(tmp);
  x = BN_new();
  y = BN_new();
  z = BN_new();
  p = BN_new();

  RAND_load_file("/dev/urandom", max_bytes);

 max_size = 256; 
 BN_rand(x, max_size, 0, 0);
 BN_rand(y, max_size, 0, 0);
 res_gen = BN_generate_prime_ex(p, max_size, 0, NULL, NULL, NULL);

 BN_mul(z, x, y, tmp);
 BN_nnmod(x, z, p, tmp);

 printf("\nOk\n");

 BN_free(x);
 BN_free(y);
 BN_free(z);
 BN_free(p);
 BN_CTX_free(tmp); 

 return 0;
}

当我使用gcc -pg -static test.c -lcrypto -ldl编译分析信息时,会产生以下结果。我得到0%(和0秒)的一切,这是出乎意料的。

Flat profile:

Each sample counts as 0.01 seconds.
no time accumulated

%   cumulative   self              self     total           
time   seconds   seconds    calls  Ts/call  Ts/call  name    
0.00      0.00     0.00        1     0.00     0.00  main


                         Call graph

granularity: each sample hit covers 2 byte(s) no time propagated

index % time    self  children    called     name
                0.00    0.00       1/1           __libc_start_main [4282]
[1]      0.0    0.00    0.00       1         main [1]
                0.00    0.00       0/0           mcount (3495)
                0.00    0.00       0/0           BN_CTX_new [275]
                0.00    0.00       0/0           BN_CTX_init [274]
                0.00    0.00       0/0           BN_new [372]
                0.00    0.00       0/0           RAND_load_file [1636]
                0.00    0.00       0/0           BN_rand [386]
                0.00    0.00       0/0           BN_generate_prime_ex [331]
                0.00    0.00       0/0           BN_mul [370]
                0.00    0.00       0/0           BN_nnmod [378]
                0.00    0.00       0/0           puts [3696]
                0.00    0.00       0/0           BN_free [327]
                0.00    0.00       0/0           BN_CTX_free [272]
-----------------------------------------------

此外,似乎探查器仅检测主方法,因为其他方法的详细信息不会出现在平面轮廓和调用图中。

所以,我想知道我是否必须使用一些选项(什么选项?)或其他东西编译OpenSSL库。

1 个答案:

答案 0 :(得分:0)

gprof是一个CPU分析器。这意味着它无法计算阻止I / O,睡眠,锁等系统调用所花费的时间。

假设目标是找到加速, 很多人做的是让它在像GDB和take stack samples manually.

这样的调试器下运行

它没有测量(精确度)。它的精确定位问题。你看到它做的任何你可以避免的事情,如果你在多个样本上看到它,将会给你一个大幅度的加速。在看到它之前你必须采取的样本越少,加速越大。