2016-04-05 9 views
1

Ich versuche, ein C-Programm zu profilieren, das einige Methoden von openssl/libcrypto verwendet. Alles funktioniert gut, wenn ich den Code kompiliere und ausführe, ohne Informationen zu erstellen. Wenn ich Optionen hinzufüge, um es mit gprof zu profilieren, erhalte ich unerwartete Ergebnisse vom Profiling-Tool.Kann libcrypto Methoden mit gprof nicht profilieren

Ich habe viele recherchiert, aber ich habe keine Seite gefunden, die mein Problem gelöst hat.

Dies ist mein Code (benannt 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; 
} 

Wenn ich mit Profilinformationen mit gcc -pg -static test.c -lcrypto -ldl kompilieren, es die folgenden Ergebnisse erzielt. Ich bekomme 0% (und 0 Sekunden) für alles, was unerwartet ist.

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] 
----------------------------------------------- 

Auch scheint es, dass der Profiler nur die Haupt-Methode erkennt, weil Details für andere Methoden scheinen nicht in flachem Profil und Grafik nennen.

Also ich würde gerne wissen, ob ich OpenSSL-Bibliothek mit einigen Optionen (welche Optionen?) Oder etwas anderes kompilieren muss.

+0

@jww: Danke für die Änderungen. Ich wusste nicht, wie man dieses Bild direkt hinzufügt. Der erste Befehlsfehler führt mich zur zweiten. Außerdem fügte ich ein zweites Bild für die zweiten Befehlsergebnisse hinzu. – Yssouf

+0

@jww: Text hinzugefügt (ich hoffe auf die richtige Weise) – Yssouf

+0

Ja, es sieht gut aus, danke. Und es testet auch gut: [Google-Suche BN_CTX_new gprof] (https://www.google.com/search?q=BN_CTX_new+grpof). Ihre Frage befindet sich im obersten Ergebnis, was bedeutet, dass sie für zukünftige Besucher indexiert ist. – jww

Antwort

0

gprof ist ein CPU-Profiler. Das bedeutet, dass es nicht für alle Zeit in Blockier-System ausgegeben Konto können Anrufe wie I/O, schlafen, Schlösser, usw.

Unter der Annahme, das Ziel ist speedups zu finden, , was viele Menschen ist kapierst es unter einem Debugger läuft wie GDB und take stack samples manually.

Es misst nicht (mit jeder Genauigkeit). Es zeigt Probleme auf. Alles, was Sie tun sehen, dass Sie vermeiden könnten, , wenn Sie es auf mehr als einer Probe sehen, wird Ihnen eine erhebliche Beschleunigung geben. Je weniger Samples Sie nehmen müssen, bevor Sie es zweimal sehen, desto größer ist die Beschleunigung.