list
lệnh in ra một tập hợp các dòng, nhưng tôi cần một dòng duy nhất, tôi đang ở đâu và có thể đã xảy ra lỗi ở đâu.
bt
hoặc backtrace
hoặc where
in chồng gọi hàm, f
hoặc frame
in dòng kế tiếp để thực thi.
list
lệnh in ra một tập hợp các dòng, nhưng tôi cần một dòng duy nhất, tôi đang ở đâu và có thể đã xảy ra lỗi ở đâu.
bt
hoặc backtrace
hoặc where
in chồng gọi hàm, f
hoặc frame
in dòng kế tiếp để thực thi.
Câu trả lời:
Tôi nhận được thông tin tương tự trong khi gỡ lỗi. Mặc dù không phải khi tôi đang kiểm tra stacktrace. Tôi nghĩ hầu hết có lẽ bạn đã sử dụng cờ tối ưu hóa. Kiểm tra liên kết này - một cái gì đó liên quan.
Thử biên dịch với -g3
loại bỏ bất kỳ cờ tối ưu hóa nào. Sau đó, nó có thể hoạt động. HTH!
-g
để chứa thông tin gỡ lỗi, nhưng tôi hiện đang ở trong một khung ngăn xếp, được lấy từ một trong những thư viện được chia sẻ, dường như không được biên dịch để chứa thông tin dòng. Cảm ơn, kumar.
Lệnh 'frame' sẽ cung cấp cho bạn những gì bạn đang tìm kiếm. (Điều này có thể được viết tắt chỉ là 'f'). Đây là một ví dụ:
(gdb) frame
\#0 zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139 int rc = fq.recv (msg_);
(gdb)
Không có đối số, 'frame' chỉ cho bạn biết bạn đang ở đâu (với đối số, nó sẽ thay đổi frame). Bạn có thể tìm thêm thông tin về lệnh frame tại đây .
Hãy nhớ rằng gdb là một lệnh mạnh mẽ - không có khả năng thực hiện các lệnh cấp thấp - vì vậy nó được gắn với các khái niệm hợp ngữ.
Những gì bạn đang tìm kiếm được gọi là con trỏ de hướng dẫn, tức là:
Thanh ghi con trỏ lệnh trỏ đến địa chỉ bộ nhớ mà bộ xử lý sẽ cố gắng thực thi lần sau. Con trỏ lệnh được gọi là ip ở chế độ 16 bit, eip ở chế độ 32 bit và trích xuất ở chế độ 64 bit.
chi tiết hơn ở đây
tất cả các đăng ký có sẵn trên thực thi gdb có thể được hiển thị với:
(gdb) info registers
với nó, bạn có thể tìm thấy chương trình của bạn đang chạy ở chế độ nào (xem có những thanh ghi nào tồn tại)
sau đó (ở đây sử dụng phần lớn đăng ký rip phổ biến hiện nay, thay thế bằng eip hoặc rất hiếm khi ip nếu cần):
(gdb)info line *$rip
sẽ hiển thị cho bạn số dòng và nguồn tệp
(gdb) list *$rip
sẽ cho bạn thấy dòng đó với một số trước và sau
nhưng có lẽ
(gdb) frame
nên đủ trong nhiều trường hợp.
ip
không bao giờ được sử dụng ở đây. Ngoài ra, thay vì đánh vần một cách rõ ràng tên của truy cập chương trình, bạn có thể sử dụng bí danh GDB cho nó: $pc
. Vì vậy, x/10i $pc
sẽ tháo rời 10 hướng dẫn tại con trỏ hướng dẫn hiện tại không phụ thuộc kiến trúc - nó sẽ làm việc trên i386, x86_64, ARM vv ..
Tất cả các câu trả lời ở trên đều đúng, Điều tôi thích là sử dụng chế độ tui (ctrl + XA) hiển thị vị trí của bạn và chức năng trong một cửa sổ riêng biệt, rất hữu ích cho người dùng. Hy vọng rằng sẽ giúp quá.
backtrace
hoặcwhere
, thậm chíinfo line
hoặc chỉ đơn giảnbt
(cho backtrace). dirac.org/linux/gdb cho một gdb hướng dẫn