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
:)
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
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
... 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