我正在尝试分析使用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库。
答案 0 :(得分:0)
gprof
是一个CPU分析器。这意味着它无法计算阻止I / O,睡眠,锁等系统调用所花费的时间。
假设目标是找到加速, 很多人做的是让它在像GDB和take stack samples manually.
这样的调试器下运行它没有测量(精确度)。它的精确定位问题。你看到它做的任何你可以避免的事情,如果你在多个样本上看到它,将会给你一个大幅度的加速。在看到它之前你必须采取的样本越少,加速越大。