2011-07-23 21 views
9

Tôi nhận được điều này trong 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*)) 

Có bất kỳ mối lo ngại nào không?

+0

tôi sẽ bỏ qua những cảnh báo này. Chúng được hiển thị ngay cả khi chạy 'valgrind' trên một chương trình' int main() {} 'tối thiểu. Tôi không chắc chắn _why_ chính xác điều này xảy ra. BTW trên máy của tôi 'valgrind' cảnh báo về' index', không phải 'strlen'. Có lẽ nó phụ thuộc vào phiên bản 'libc' của bạn. –

Trả lời

13

Một phần lớn phép thuật của Valgrind là cách nó có thể chặn/chuyển hướng các cuộc gọi hàm để theo dõi trạng thái của thế giới.

Như tôi đã hiểu, chuyển hướng đạt được bằng cách sử dụng các mẫu tên đối tượng/chức năng được chia sẻ khi các cuộc gọi 'chuyển hướng' trùng khớp đến địa chỉ mới. Kiểm tra ra nguồn valgrind, chúng ta thấy khái niệm về một 'redirector':

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) 

(dòng m_redir.c 104)

Vì vậy, 'Specs' cung cấp chia sẻ tên đối tượng/chức năng để giải quyết các ánh xạ và 'Actives 'đại diện cho bản đồ ánh xạ.

kích hoạt tính:

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

(dòng m_redir.c 120)

Ý tưởng về "chuyển hướng mâu thuẫn" được đề cập ở đây quá:

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 dòng 152)

Và vì lợi ích, đây là nơi cảnh báo của bạn được tạo:

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 dòng 664)

Vì vậy, sau khi tất cả điều này nó có lẽ là an toàn để giả định rằng:

  1. Các thông điệp chuyển hướng là một phần của hoạt động valgrind bình thường.
  2. Thông điệp cảnh báo có thể là một kết quả của mô hình đặc tả mâu thuẫn

Tài liệu tham khảo (có thể không phải là một nguyên nhân để lo lắng trong trường hợp này.): Valgrind manual, Valgrind 3.6.1 source

+2

Lưu ý rằng tôi đã nhận được những điều này khi tôi sử dụng valgrind như thế này: 'valgrind --leak-check = full -v./Your_program'. Nếu tôi xóa '-v', tôi không nhận được chúng. Rất đẹp mà có câu hỏi và câu trả lời này, các anh chàng bravo! :) Tôi có nghĩa là tôi đã rất bối rối những gì đang xảy ra! – gsamaras