2012-05-15 27 views
15

Tôi vừa bắt đầu sử dụng ngoại lệ C++ và muốn làm đúng. Những gì tôi có trong tâm trí là để tạo ra một số loại thông tin backtrace khi trường hợp ngoại lệ bị bắt. Ban đầu tôi đã có ý tưởng tương tự như Call-stack for exceptions in C++ nhưng cuối cùng đã tìm ra rằng không phải là khá tốt.Gdb có thể được sử dụng để backtrace khi bị bắt buộc ngoại lệ?

Tôi cũng đã đọc How to generate a stacktrace when my gcc C++ app crashes nhưng không muốn thêm độ phức tạp hơn cho dự án hiện tại của mình. Kể từ khi, tôi chỉ cần backtracing khi ở chế độ gỡ lỗi, tôi đã hy vọng tôi có thể sử dụng gdb cho mục đích đó.

Chiến lược của tôi là chèn điểm ngắt trong khối catch và sau đó đi lên qua ngăn xếp cuộc gọi để xác định chính xác lý do ngoại lệ được ném ở địa điểm đầu tiên (hoặc điều gì gây ra nó)? Thật không may, tôi dường như không thể làm điều này kể từ khi gdb đạt đến breakpoint, nó xóa ngăn xếp cuộc gọi và tôi chỉ có thể nhìn thấy chính (đó là nơi tôi bắt). Điều này có nghĩa vụ xảy ra hay tôi đang làm điều gì sai ở đây?

Edit: Tôi chỉ muốn tóm tắt các phương pháp vào đây để folks khác:

Phương pháp 1 (bởi paulsm4). Đặt điểm bắt qua catch throw để bắt hoặc ném catch catch để bắt nhịp! Sau đó gọi backtrace

2 Phương pháp (bằng aschepler) Thiết lập một breakpoint trên __cxa_throw và sau đó backtrace

Phương pháp thứ 3 (trong Qt Creator - nếu bạn xảy ra để sử dụng) Bạn có thể dễ dàng thiết lập một breakpoint trên ném hoặc bắt!

Edit_2: Sử dụng Qt Creator debugger, có vẻ như thiết lập một breakpoint trên __cxa_begin_catch cũng là một tương đương với catch catch :)

+0

Hãy thử kiểm tra ra câu trả lời của câu hỏi này: http://stackoverflow.com/questions/2443135/how -do-i-find-where-an-exception-được-ném-in-c – MCKapur

+0

Một thử nghiệm nhanh cho g ++/Linux cho thấy nó có thể hữu ích để thiết lập một điểm ngắt tại hàm bên trong '__cxa_throw'. – aschepler

+2

... và bây giờ tôi đọc câu trả lời của @ paulsm4, có vẻ như lệnh gdb 'catch throw' thực chất là vậy. (Nếu tôi làm cả hai 'break' và' catch', gdb ghi chú với tôi rằng cả hai đều sử dụng cùng một địa chỉ máy tính.) – aschepler

Trả lời

14

này này:

http://sourceware.org/gdb/onlinedocs/gdb/Set-Catchpoints.html

Bạn có thể sử dụng các điểm bắt buộc làm cho trình gỡ lỗi dừng lại cho một số sự kiện chương trình nhất định, chẳng hạn như ngoại lệ C++ hoặc tải một số thư viện được chia sẻ. Sử dụng lệnh catch để thiết lập một điểm bắt.

Vì vậy, câu trả lời phải là "có" và bạn nên tránh các vấn đề với hai liên kết mà bạn đã trích dẫn.

Vui lòng đăng lại nếu được trợ giúp! Cá nhân, tôi chưa bao giờ cố gắng GDB này đều bản thân mình :)

+2

CÓ: D Dường như nó hoạt động. ngay bây giờ tôi có thể chèn một điểm bắt bằng cách sử dụng 'catch throw'. Một khi ngoại lệ được ném, tôi có thể sử dụng 'backtrace' để lấy toàn bộ stack cuộc gọi: D: D. Cảm ơn bạn rất nhiều – GradGuy

0

Tóm tắt các câu trả lời từ các ý kiến:

Phương pháp 1 (bởi paulsm4). Đặt điểm bắt qua catch throw để bắt hoặc ném catch catch để bắt nhịp! Sau đó gọi backtrace

2 Phương pháp (bằng aschepler) Thiết lập một breakpoint trên __cxa_throw và sau đó backtrace

Phương pháp thứ 3 (trong Qt Creator - nếu bạn xảy ra để sử dụng) Bạn có thể dễ dàng thiết lập một breakpoint trên ném hoặc bắt!

Sử dụng Qt Creator debugger, có vẻ như thiết lập một breakpoint trên __cxa_begin_catch cũng là một tương đương với catch catch

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