2015-04-19 15 views
6

Tôi đang cố gắng gỡ lỗi một lớp dựa chủ yếu vào thừa kế. Một phiên gỡ rối là tẻ nhạt vì nó liên quan đến một đối tượng gọi cùng một hàm trên một đối tượng khác trong một chuỗi. Tôi lãng phí rất nhiều thời gian bước mã không liên quan có thể được chi tiêu tốt hơn ở nơi khác.Đặt điểm ngắt bằng ký tự đại diện?

Đây là cách dễ dàng: Tôi muốn đặt điểm ngắt trên phiên bản lớp bằng ký tự đại diện, như b Foo::*. Bằng cách này, khi những thứ tôi quan tâm vào phạm vi (như một hàm tĩnh hoặc một hàm thành viên), trình gỡ lỗi sẽ chụp.

Đây là điểm khó: lớp được tham số hóa: Tôi muốn đặt điểm ngắt trên hàm thành viên của lớp khuôn mẫu bằng cách sử dụng ký tự đại diện, như b Foo<*>::bar. (Vấn đề thực sự tồi tệ hơn nhiều so với điều này bởi vì các tham số mẫu là bản thân các lớp mẫu).

Mặc dù GDB xuất hiện để tôi đặt một, trình gỡ lỗi không dừng lại (xem bên dưới). Nó tuyên bố của nó thiết lập một breakpoint về tải trong tương lai. Trong thực tế, tôi đã sử dụng liên kết tĩnh và các biểu tượng đã có mặt. Sẽ không có thư viện nào được tải.

Làm cách nào để đặt điểm ngắt bằng ký tự đại diện?


(gdb) b CryptoPP::PK_EncryptorFilter::* 
Function "CryptoPP::PK_EncryptorFilter::*" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) y 

Breakpoint 2 (CryptoPP::PK_EncryptorFilter::*) pending. 
(gdb) r 
Starting program: /home/cryptopp-ecies/ecies-test.exe 
Attack at dawn! 
[Inferior 1 (process 5163) exited normally] 

Và:

(gdb) rbreak CryptoPP::DL_EncryptionAlgorithm_Xor<*>::SymmetricEncrypt 
(gdb) r 
Starting program: /home/cryptopp-ecies/ecies-test.exe 
Attack at dawn! 
[Inferior 1 (process 5470) exited normally] 
... 

(gdb) rbreak CryptoPP::*::SymmetricEncrypt 
(gdb) r 
Starting program: /home/cryptopp-ecies/ecies-test.exe 
Attack at dawn! 
[Inferior 1 (process 5487) exited normally] 

Trả lời

7

Bạn có thể sử dụng rbreak theo cú pháp:

(gdb) rbreak ^CryptoPP::PK_EncryptorFilter::.* 

Xem người đàn ông gdb: https://sourceware.org/gdb/onlinedocs/gdb/Set-Breaks.html

Edit:

tôi đã làm một số điều tra và main.cc tạo như sau:

#include <cstdio> 

template <class OnlyOne> class MyTemplate { 
public: 
    OnlyOne oo; 
    void myfunc(){ 
     printf("debug\n"); 
    } 
}; 


int main() { 
    MyTemplate<int> mt; 
    mt.myfunc(); 
    return 0; 
} 

Sau đó, trong gdb:

(gdb) rbreak MyTemplate<.*>::myfunc 
Breakpoint 1 at 0x40055e: file main.cc, line 7. 
void MyTemplate<int>::myfunc(); 
(gdb) r 

debuger không có vấn đề với việc tìm kiếm các điểm để phá vỡ ... Bạn cần phải thử .* thay vì ký tự đại diện đơn giản.

+0

Cảm ơn. Không có niềm vui trên một khó khăn (C + + và các mẫu). Tôi đã cập nhật câu hỏi để bao gồm kết quả. – jww

+0

bạn có chắc là bạn không quên dấu chấm: 'CryptoPP :: DL_EncryptionAlgorithm_Xor <.*> :: SymmetricEncrypt' –

+0

Vâng, tôi không sử dụng dấu chấm. Các trang người đàn ông cho biết dấu chấm đã có mặt. Cảm ơn, đã giải quyết nó. – jww

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