2013-02-05 19 views
6

Một chương trình của tôi ném một số std::out_of_range. Tôi biết lý do cho điều đó, tôi đang truy cập một vector với chỉ số -1 ở đâu đó. Những gì tôi không biết là tên của vector (tên biến) và vị trí trong mã. Các thông báo lỗi được tạo ra bởi chương trình của tôi trông như thế này:Tìm đối tượng ném std :: out_of_range

terminate called after throwing an instance of 'std::out_of_range' 
    what(): vector::_M_range_check 
zsh: abort (core dumped) ./main.x config.cfg 

khi được thông báo lỗi được tạo ra bởi mã của một số anh chàng khác (ông sử dụng g++ quá) và được đăng trong câu hỏi C++ accessing vector trông như thế này:

Error for vec.at(i).setVec(tmp); 
Error is: terminate called after throwing an instance of 'std::out_of_range' 
    what(): vector::_M_range_check 

Tức là anh ta được cho biết tên của biến. Câu hỏi của tôi là:

Có cách nào để yêu cầu g++/gcc cung cấp cho tôi thông tin mở rộng không? Thậm chí có thể bao gồm số dòng (không biết liệu điều đó có thể nhưng hey, một chàng trai có thể mơ ước)).
Chỉ cần cho funsies tôi chạy chương trình của tôi trong gdb với các tùy chọn catch thrown (tôi có thể thêm, tôi có kinh nghiệm gần bằng không trong việc sử dụng một trình gỡ lỗi thực tế) mà không cho tôi biết bất cứ điều gì mới hoặc, trên thực tế, nó đã không cho tôi biết rằng lỗi là do một ngoại lệ std::out_of_range.

Btw, cờ biên dịch của tôi (cho debug) là:

CFLAGS = --exceptions -I$(ROOTSYS)/include --std=c++11 -Wall -g -O0 -fno-inline -fno-eliminate-unused-debug-types 
+9

Sau khi chạy 'gdb' với' catch throw', khi ngoại lệ bị bắt, hãy nhập 'where'. –

+0

@DavidSchwartz Tuyệt vời! Vì vậy, bây giờ tôi có số dòng từ 'gdb', bất kỳ cơ hội nào để nhận được thông báo lỗi thứ hai (tức là tên không có trình gỡ lỗi)? – elemakil

Trả lời

3

Sau khi nhấn điểm ngắt, nhập lệnh bt (backtrace) vào gdb shell. Thao tác này sẽ in dấu vết ngăn xếp (một chuỗi các cuộc gọi hàm dẫn đến lỗi).

Để lấy tên biến, bây giờ bạn có thể sử dụng lệnh up để điều hướng lên trên trong ngăn xếp và xem biến nào được sử dụng trong mỗi hàm đó.

+0

Điều này hoạt động như mong đợi, sau khi di chuyển lên đầu ngăn xếp (tức là nhiều lệnh 'up') dòng có mã bị lỗi được in. – elemakil

3

Đặt một breakpoint trên std::out_of_range::out_of_range. Một đối tượng ngoại lệ, giống như tất cả các đối tượng C++, bắt đầu cuộc sống của nó sau khi các hàm khởi tạo của nó.

[EDIT] Nhận xét đã làm rõ: vấn đề chuỗi được tạo bởi std::out_of_range::what(). Đó là thực hiện xác định. Rõ ràng trong trường hợp của bạn, nó được tạo từ __FUNCTION__, một macro GCC đặt tên cho hàm hiện tại (tức là ném). Nhưng một hàm như vậy chỉ biết this, tức là con trỏ tới đối tượng hiện tại chứ không phải tên của nó. Trong trường hợp khác, tên đối tượng được truy xuất thông qua một số phương thức khác, không phải là std::out_of_range::what().

+0

Tôi giả sử bạn có nghĩa là tôi thực thi 'break std :: out_of_range :: out_of_range' trong' gdb' trước khi thực hiện ứng dụng (tức là lệnh 'run'). Chỉ làm điều này có tác dụng tương tự như 'catch throw', do đó phát hành 'where' sau khi breakpoint đã đạt được (như đề xuất bởi @DavidSchwartz) cho thấy số dòng. Tuy nhiên, tương tự như giải pháp của mình, điều này liên quan đến việc sử dụng một trình gỡ rối, phải không? Đó là để nói rằng thông báo lỗi thứ hai không thể đạt được bằng cách sử dụng phương pháp này. – elemakil

+0

Tôi cho rằng không có cách nào dễ dàng để thêm chức năng in tên đối tượng? – elemakil

+0

@elemakil: Không, đó là vấn đề. Hàm này ném _does_ biết con trỏ 'this' này đến đối tượng và tên hàm riêng của nó, nhưng không biết tên đối tượng. (Bỏ qua câu hỏi triết học, cái tên đối tượng _the_ là gì - thường phụ thuộc vào mức độ sâu thẳm của bạn trong callstack). – MSalters

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