2011-07-23 24 views
9

私はValgrindでこれを取得します。C++/Valgrind REDIR

--24101-- REDIR: 0xbb20580 (operator delete(void*)) redirected to 0x93b7d48 (operator delete(void*)) 
--24101-- REDIR: 0xbb22580 (operator new[](unsigned long)) redirected to 0x93b88b7 (operator new[](unsigned long)) 
==24101== WARNING: new redirection conflicts with existing -- ignoring it 
--24101--  new: 0x15632010 (__GI_strlen  ) R-> 0x093b96b0 strlen 
--24101-- REDIR: 0xbb205c0 (operator delete[](void*)) redirected to 0x93b79c4 (operator delete[](void*)) 

これは問題ありませんか?

+0

私はこれらの警告を無視していました。最小限の 'int main(){}'プログラムで 'valgrind'を実行しても表示されます。私は、確かにこれが起こるかどうかはわかりません。私のマシンでは、 'valgrind'は' strlen'ではなく 'index'について警告します。おそらくそれはあなたの 'libc'バージョンに依存します。 –

答えて

13

Valgrindの魔法の大部分は、世界の状態を追跡するために関数呼び出しを傍受/リダイレクトする方法です。

私が理解しているように、リダイレクトは、新しいリダイレクトの呼び出しと一致したときに、新しいオブジェクトに関数名パターンを使用して達成されます。 valgrindのソースをチェックアウト、私たちは、「リダイレクタ」の概念を見つける:

The redirector holds two pieces of state: 

Specs - a set of (soname pattern, fnname pattern) -> redir addr 
Active - a set of orig addr -> (bool, redir addr) 

(m_redir.cラインを104)

だから、「仕様」のマッピングと「活性物質に対処するための共有オブジェクト/関数名を提供'はマッピング自体を表します。

アクティブ計算: "競合リダイレクト" の考え方があまりにもここに記載されている

Active = empty 
for spec in Specs { 
    sopatt = spec.soname pattern 
    fnpatt = spec.fnname pattern 
    redir = spec.redir addr 
    for so matching sopatt in SyminfoState { 
     for fn matching fnpatt in fnnames_of(so) { 
     &fn -> redir is added to Active 
     } 
    } 
} 

(120 m_redir.cライン):

Clearly we must impose the requirement that domain(Active) contains 
no duplicates. The difficulty is how to constrain Specs enough to 
avoid getting into that situation. It's easy to write specs which 
could cause conflicting bindings in Active, eg: 

    (libpthread.so, pthread_mutex_lock) -> a1 
    (libpthread.so, pthread_*)   -> a2 

for a1 != a2. Or even hairier: 

    (libpthread.so, pthread_mutex_*) -> a1 
    (libpthread.so, pthread_*_lock) -> a2 

(m_redir.c線152 )

そして、ここであなたの警告が生成されます:

old = VG_(OSetGen_Lookup)(activeSet, &act.from_addr); 
if (old) { 
    /* Dodgy. Conflicting binding. */ 
    vg_assert(old->from_addr == act.from_addr); 
    if (old->to_addr != act.to_addr) { 
     /* we have to ignore it -- otherwise activeSet would contain 
     conflicting bindings. */ 
     what = "new redirection conflicts with existing -- ignoring it"; 
     goto bad; 
    } 

(m_redir.cライン664)は

だから、このすべての後に、おそらく、それを仮定しても安全である:

  1. リダイレクトメッセージは、通常のvalgrindの操作の一部です。
  2. 警告メッセージは、おそらく競合スペックパターンの結果である

参考文献(この例では懸念のためにおそらくない大きな原因。):Valgrind manualValgrind 3.6.1 source

+2

このようにvalgrindを使用したときには、 'valgrind --leak-check = full -v。/ your_program'を使用しています。 '-v'を削除しても、私はそれらを受け取っていません。非常に良いこの質問と回答は、ブラボーの男がある! :)私は何が起こっていた非常に混乱していたことを意味する! – gsamaras

関連する問題