2013-05-07 11 views
5

Tôi có một bãi chứa sự cố mà tôi đang cố phân tích (VC++ 2010).Phương pháp std :: bản đồ nào giống hệt nhau (và có thể chia sẻ biểu tượng) bất kể tham số mẫu là gì?

Sau đó tôi có một callstack trông như thế này (tôi đã cắt rất nhiều ở đây cho dễ đọc):

myapp.exe!std::_Tree<std::_Tmap_traits<unsigned int,StructB,std::less<unsigned int> ... >::_Erase(...) 
myapp.exe!std::_Tree<std::_Tmap_traits<unsigned int,StructA,std::less<unsigned int>,... >::clear() 

(clear() gọi _Erase())

Lưu ý sự khác biệt trong tham số mẫu của giá trị (StructA vs. StructB). Bây giờ, tôi biết các phương thức khác nhau có cùng một nhị phân có thể có cùng biểu tượng trong PDB mặc dù chúng thực sự sử dụng mã khác nhau. Tôi giả định đây là trường hợp ở đây (std :: map :: _ Erase là như nhau không có vấn đề loại giá trị).

Nhưng làm sao tôi biết? Có một danh sách các phương pháp STL (cho việc thực hiện MS này) mà nó áp dụng? Có thể đó là một loại lỗi nào đó không?

Cập nhật:

Nhìn vào PDB (trong một trình soạn thảo văn bản), tôi thấy nhiều std :: map < ...> :: _ Erase, và đặc biệt là tôi thấy họ cho cả StructA và StructB. Tôi không biết nếu nó có nghĩa là bất cứ điều gì về gấp.

Ngoài ra, mã đã tháo rời của std :: map hiển thị cuộc gọi đến một địa chỉ được hiểu là std :: map. Tôi đoán mã này có nghĩa là gấp ...

+0

Có thể nếu bạn mở tập tin exe/dll của mình với bộ khung phụ thuộc, bạn có thể tìm thấy tất cả các ký hiệu _Erase và xem liệu có thực sự là hai hay không. Tôi không bao giờ cố gắng kiểm tra nó bản thân mình, vì vậy tôi không thể nói từ kinh nghiệm nếu điều này sẽ hữu ích trong trường hợp này. – selalerer

Trả lời

0

Vâng, tôi đã kết thúc việc xây dựng lại bằng cách tạo tệp bản đồ. Trong tệp bản đồ, tôi có thể thấy rằng cả hai phương thức (_Erase cho StructA và _Erase cho StructB) đều có cùng địa chỉ. Vì vậy, nó không phải là một lỗi.

1

Bạn có thể sử dụng /OPT:NOICF để vô hiệu hóa hành vi gấp mã.

http://msdn.microsoft.com/en-us/library/bxwfs976%28v=vs.80%29.aspx

+0

Cảm ơn. Có cách nào để làm điều đó sau khi chết? Hoặc ít nhất có được trình biên dịch để in những chức năng nó gấp lại với nhau/bỏ qua gấp lại với nhau? – Asaf

+0

@Asaf: Phiên bản đáng tin cậy nhất là phiên bản bên ngoài, vì đây là phiên bản có nhiều mã nhất tùy thuộc vào loại thực. Ở bất kỳ tỷ lệ nào, hãy tìm biểu tượng đầu tiên không nằm trong thư viện chuẩn mà hy vọng không sử dụng quá nhiều loại bản đồ khác nhau. –

Các vấn đề liên quan