Tôi muốn kiểm tra nội dung của một std::vector
trong GDB, làm thế nào để tôi làm điều đó? Hãy nói rằng đó là mộtstd::vector<int>
vì đơn giản.
Tôi muốn kiểm tra nội dung của một std::vector
trong GDB, làm thế nào để tôi làm điều đó? Hãy nói rằng đó là mộtstd::vector<int>
vì đơn giản.
Câu trả lời:
Để xem nội dung vector std :: vector myVector, chỉ cần nhập GDB:
(gdb) print myVector
Điều này sẽ tạo ra một đầu ra tương tự như:
$1 = std::vector of length 3, capacity 4 = {10, 20, 30}
Để đạt được điều trên, bạn cần phải có gdb 7 (tôi đã thử nghiệm nó trên gdb 7.01) và một số máy in đẹp python. Quá trình cài đặt này được mô tả trên wiki gdb .
Hơn nữa, sau khi cài đặt ở trên, điều này hoạt động tốt với GUI gỡ lỗi Eclipse C ++ (và bất kỳ IDE nào khác sử dụng GDB, như tôi nghĩ).
$HOME/.gdbinit
là cần thiết. Hiện tại tôi không có tập tin nào như vậy cả và gdb
hiển thị chính xác nội dung của std::vector
. Tuy nhiên, vì trong những lần thử "lan man" của tôi, tôi chỉ cài đặt và sau đó cgdb
chưa được libstdc++5
cài đặt và tôi đã cài đặt, tôi không biết tại sao bản in đẹp không hoạt động trong khi bây giờ nó hoạt động.
Với GCC 4.1.2, để in toàn bộ std :: vector <int> được gọi là myVector, hãy làm như sau:
print *(myVector._M_impl._M_start)@myVector.size()
Để chỉ in các phần tử N đầu tiên, hãy làm:
print *(myVector._M_impl._M_start)@N
Giải trình
Điều này có thể phụ thuộc nhiều vào phiên bản trình biên dịch của bạn, nhưng đối với GCC 4.1.2, con trỏ tới mảng bên trong là:
myVector._M_impl._M_start
Và lệnh GDB để in N phần tử của một mảng bắt đầu từ con trỏ P là:
print P@N
Hoặc, ở dạng ngắn (đối với .gdbinit tiêu chuẩn):
p P@N
Cannot evaluate function -- may be inlined
_M_impl
v.v.) cho trình biên dịch của bạn trong GDB 7.0+, hãy sử dụngprint /r myVector
'Xem' STL container trong khi gỡ lỗi là một vấn đề. Dưới đây là 3 giải pháp khác nhau tôi đã sử dụng trong quá khứ, không có giải pháp nào là hoàn hảo.
1) Sử dụng tập lệnh GDB từ http://clith.com/gdb_stl_utils/ Các tập lệnh này cho phép bạn in nội dung của hầu hết các bộ chứa STL. Vấn đề là điều này không hoạt động đối với các container lồng nhau như một tập hợp các tập hợp.
2) Visual Studio 2005 hỗ trợ tuyệt vời để xem các container STL. Điều này hoạt động cho các thùng chứa lồng nhau nhưng điều này chỉ dành cho việc triển khai STL và không hoạt động nếu bạn đặt một container STL trong một thùng chứa Boost.
3) Viết chức năng (hoặc phương thức) in của riêng bạn cho mục cụ thể bạn muốn in trong khi gỡ lỗi và sử dụng 'cuộc gọi' trong khi ở GDB để in mục đó. Lưu ý rằng nếu chức năng in của bạn không được gọi ở bất kỳ đâu trong mã g ++ sẽ thực hiện loại bỏ mã chết và chức năng 'in' sẽ không được tìm thấy bởi GDB (bạn sẽ nhận được thông báo nói rằng chức năng này được nội tuyến). Vì vậy, biên dịch với -fkeep-inline-Hàm
đặt nội dung sau vào ~ / .gdbinit
define print_vector
if $argc == 2
set $elem = $arg0.size()
if $arg1 >= $arg0.size()
printf "Error, %s.size() = %d, printing last element:\n", "$arg0", $arg0.size()
set $elem = $arg1 -1
end
print *($arg0._M_impl._M_start + $elem)@1
else
print *($arg0._M_impl._M_start)@$arg0.size()
end
end
document print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
end
Sau khi khởi động lại gdb (hoặc tìm nguồn cung ứng ~ / .gdbinit), hãy hiển thị trợ giúp liên quan như thế này
gdb) help print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
Ví dụ sử dụng:
(gdb) print_vector videoconfig_.entries 0
$32 = {{subChannelId = 177 '\261', sourceId = 0 '\000', hasH264PayloadInfo = false, bitrate = 0, payloadType = 68 'D', maxFs = 0, maxMbps = 0, maxFps = 134, encoder = 0 '\000', temporalLayers = 0 '\000'}}