2013-10-05 1 views
0

У меня неожиданное поведение с базовым инструментом Valgrind. Для каждого оператора Put базового блока я регистрирую грязный помощник, используя unsafeIRDirty_0_N. Проблема в том, что грязный помощник называется больше времени, чем ожидалось, , например. есть 5 операторов Put в базовом блоке, но грязный помощник называется 13 раз. Мне нужно использовать грязные помощники в моем инструменте, но сейчас я застрял, любая помощь была бы очень признательна.Valgrind грязный помощник называется больше, чем ожидалось

Вот код:

unsigned int g_Put_cnt; // the number of Put statements in the basic block 
unsigned int g_helper_Put_cnt; // the number of times helper_Put() was 
called 

static VG_REGPARM(0) void helper_print_counters() 
{ 
    VG_(printf)("g_Put_cnt: %d - g_helper_Put_cnt: %d (%d)\n", g_Put_cnt, 
g_helper_Put_cnt, g_helper_Put_cnt-g_Put_cnt); 
} 

static VG_REGPARM(0) void helper_Put() 
{ 
    g_helper_Put_cnt++; 
} 

static 
IRSB* fz_instrument (VgCallbackClosure* closure, 
         IRSB* sb_in, 
         VexGuestLayout* layout, 
         VexGuestExtents* vge, 
         IRType gWordTy, IRType hWordTy) 
{ 
    IRSB* sb_out; 
    Int i; 

    if (gWordTy != hWordTy) { 
     /* We don't currently support this case. */ 
     VG_(tool_panic)("host/guest word size mismatch"); 
    } 

    /* Set up sb_out */ 
    sb_out = deepCopyIRSBExceptStmts(sb_in); 

    // Copy verbatim any IR preamble preceding the first IMark 
    i = 0; 
    while (i < sb_in->stmts_used && sb_in->stmts[i]->tag != Ist_IMark) { 
     addStmtToIRSB(sb_out, sb_in->stmts[i]); 
     i++; 
    } 

    g_Put_cnt = 0; 
    g_helper_Put_cnt = 0; 

    for (/*use current i*/; i < sb_in->stmts_used; i++) 
    { 
     IRStmt* st = sb_in->stmts[i]; 
     IRDirty* di; 

     if (!st) 
      continue; 

     switch (st->tag) 
     { 
      case Ist_Put: 
       di = unsafeIRDirty_0_N(0, 
             "helper_Put", 
             VG_(fnptr_to_fnentry)(&helper_Put), 
             mkIRExprVec_0()); 
       addStmtToIRSB(sb_out, IRStmt_Dirty(di)); 

       g_Put_cnt++; 
       break; 
     } 

     addStmtToIRSB(sb_out, st); 
    } 

    IRDirty* di = unsafeIRDirty_0_N(0, "helper_print_counters", 
VG_(fnptr_to_fnentry)(&helper_print_counters), mkIRExprVec_0()); 
    addStmtToIRSB(sb_out, IRStmt_Dirty(di)); 

    return sb_out; 
} 

И выход:

g_Put_cnt: 22 - g_helper_Put_cnt: 22 (0) 
g_Put_cnt: 21 - g_helper_Put_cnt: 21 (0) 
g_Put_cnt: 8 - g_helper_Put_cnt: 8 (0) 
g_Put_cnt: 5 - g_helper_Put_cnt: 13 (8) 
g_Put_cnt: 5 - g_helper_Put_cnt: 18 (13) 
g_Put_cnt: 6 - g_helper_Put_cnt: 6 (0) 
g_Put_cnt: 6 - g_helper_Put_cnt: 6 (0) 
g_Put_cnt: 9 - g_helper_Put_cnt: 9 (0) 
g_Put_cnt: 9 - g_helper_Put_cnt: 22 (13) 
g_Put_cnt: 9 - g_helper_Put_cnt: 35 (26) 
g_Put_cnt: 9 - g_helper_Put_cnt: 48 (39) 
g_Put_cnt: 9 - g_helper_Put_cnt: 61 (52) 
g_Put_cnt: 9 - g_helper_Put_cnt: 74 (65) 
g_Put_cnt: 9 - g_helper_Put_cnt: 87 (78) 
g_Put_cnt: 9 - g_helper_Put_cnt: 100 (91) 
g_Put_cnt: 9 - g_helper_Put_cnt: 113 (104) 
g_Put_cnt: 9 - g_helper_Put_cnt: 126 (117) 
g_Put_cnt: 9 - g_helper_Put_cnt: 139 (130) 
g_Put_cnt: 9 - g_helper_Put_cnt: 152 (143) 
g_Put_cnt: 9 - g_helper_Put_cnt: 157 (148) 
... 

Спасибо заранее.

ответ

0

Я получил ответ на список рассылки Valgrind:

http://sourceforge.net/mailarchive/message.php?msg_id=31488717

+0

1 пункт Дюран ипе année и др ип Mois :) –

+0

@Begueradj T'as па inventé l'Eau Tiede тои. "видно окт. 12, 13 в 21:30" sur ma page de profil ça veut dire que je me suis pas connecté durant une année et un mois. –

+0

Oui, je savais, c'était juste pour plaianter :) –

 Смежные вопросы

  • Нет связанных вопросов^_^