2011-04-19 22 views
11

tôi có thể nói chương trình gỡ rối gdb để ngăn chặn càng sớm càng bất kỳ ++ ngoại lệ C được ném bằng cách thiết lập một catchpoint với lệnh gdbĐiểm bắt đầu gdb chỉ để loại trừ ngoại lệ C++?

catch throw 

Tuy nhiên, liệu có cách nào để chỉ dừng lại ở uncaught C++ ngoại lệ (như trong C# hoặc Java)? Điều này sẽ làm cho nó dễ dàng hơn nhiều để tìm lỗi trong một số trường hợp.

Cảm ơn!

+0

liên quan - [Làm thế nào để tìm ra nơi ngoại lệ được ném trong C++?] (Http://stackoverflow.com/q/2443135/203667) – jschmier

+0

Tôi không nghĩ rằng tôi hiểu - làm thế nào để bạn xác định nếu một ngoại lệ là không bị bắt buộc khác hơn là để cho nó mở ra cho đến khi nó phá vỡ thông qua các toplevel? – Mat

+0

Vâng, tôi đoán gdb sẽ phải kiểm tra xem liệu ngoại lệ có bị bắt hay không * trước khi * thực sự mở ngăn xếp. Tôi không biết làm thế nào C# hoặc Java giải quyết điều này, nhưng tôi chỉ tò mò nếu nó có thể được thực hiện trong C + + dù sao đi nữa. – emkey08

Trả lời

11

Nếu ngoại lệ không được thực hiện, chức năng thư viện đặc biệt terminate() sẽ tự động được gọi. Chấm dứt thực sự là một con trỏ đến một hàm và giá trị mặc định là hàm thư viện chuẩn C abort(). Bạn có thể có thể đặt điểm ngắt trên cuộc gọi đến chức năng abort() và xác định vị trí của ngoại lệ chưa được thực hiện từ đó.

break abort 
... 
run 
... 
bt 

Bạn có thể cài đặt riêng terminate() chức năng của bạn bằng cách sử dụng std::set_terminate(). Bạn sẽ có thể thiết lập một điểm ngắt trên hàm chấm dứt của bạn trong gdb. Bạn có thể có thể tạo ngăn xếp ngược từ chức năng terminate() và backtrace có thể trợ giúp trong việc xác định vị trí ngoại lệ. Chi tiết bổ sung được cung cấp here.

+0

Cảm ơn, nó làm việc cho tôi với set_terminate() - sử dụng g ++ 4.5.0, gdb 7.2 – emkey08

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