Làm thế nào để bước vào, bước qua và bước ra với GDB?


42

Tôi đã gõ helptrong khi tôi ở GDB nhưng không tìm thấy bất cứ điều gì về bước vào, bước qua và bước ra. Tôi đặt một điểm dừng trong một chương trình hội trong _start( break _start). Sau đó tôi gõ nextvà nó đã hoàn thành việc gỡ lỗi. Tôi đoán đó là vì nó đã hoàn thành _startvà không bước vào như tôi muốn.

Bất cứ ai có thể giúp đỡ?


Đọc các tài liệu GDB đầy đủ. Khi tôi nhớ lại, họ khá hữu ích về điều này, khi tôi lần đầu tiên học nó. Thật không may, tôi không cần phải gỡ lỗi bất kỳ chương trình nào ở cấp độ đó trong nhiều thập kỷ, vì vậy các lệnh thực tế dường như đã bị tráo đổi trong não. Vì vậy, tôi thực sự không thể viết một câu trả lời. Nhưng, nếu bạn tìm ra nó từ sách hướng dẫn, thì bạn có thể trả lời câu hỏi của riêng bạn để nhận tiền thưởng.
MAP

@MAP Tôi sẽ thử lại. Tôi đã cố gắng sử dụng trình gỡ lỗi tốt hơn (KDbg) nhưng tôi không thành công khi sử dụng nó trong Ubuntu .
Pichi Wuana

Câu trả lời:


38

help running cung cấp một số gợi ý:

stepvà bản năng next(và cũng nextistepi).

(gdb) help next
Step program, proceeding through subroutine calls.
Usage: next [N]
Unlike "step", if the current source line calls a subroutine,
this command does not enter the subroutine, but instead steps over
the call, in effect treating it as a single source line.

Vì vậy, chúng ta có thể thấy rằng stepcác bước vào chương trình con, nhưng nextsẽ bước qua chương trình con.

Các stepstepi(và nextnexti) được phân biệt theo gia số "dòng" hoặc "hướng dẫn".

step -- Step program until it reaches a different source line
stepi -- Step one instruction exactly

Liên quan là finish:

(gdb) help finish
Execute until selected stack frame returns.
Usage: finish
Upon return, the value returned is printed and put in the value history.

Nhiều thông tin hữu ích hơn có tại https://sourceware.org/gdb/onlinesocs/gdb/Continuing-and-Stepping.html


Điều đó có nghĩa là gì cho đến khi nó đạt đến một dòng nguồn khác nhau ?
Pichi Wuana

1
for(i=0;i<10;i++) { printf("%d\n",i); }là một dòng nguồn nhưng nhiều hướng dẫn.
Stephen Harris

3
Có cách nào để bước ra ngoài? Tôi không thể tìm thấy nó trong trợ giúp chạy.
nukeguy

1
Bạn có ý nghĩa gì khi "bước ra"? Các finishlệnh sẽ hoàn thành stack frame hiện tại, mà thông thường sẽ hoàn thành chương trình con hiện tại và trở về người gọi.
Stephen Harris

@PichiWuana gdb sẽ thực hiện càng nhiều hướng dẫn lắp ráp cần thiết cho đến khi đạt được hướng dẫn đầu tiên đại diện cho dòng mã nguồn tiếp theo
U007D

0

Tôi đến đây vì tôi có cùng một câu hỏi. Cuối cùng tôi đã hiểu rằng với mục đích của mình bất cứ khi nào tôi có thể sử dụng một cái gì đó như "bước ra" của một vòng lặp, tôi chỉ có thể đặt một điểm dừng khác sau vòng lặp và sau đó để chương trình continuekết thúc vòng lặp và chạy vào điểm dừng sau đó. Xin lỗi nếu điều đó là hiển nhiên đối với hầu hết mọi người nhưng nó có thể hữu ích cho ai đó đang tìm kiếm câu trả lời cho câu hỏi này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.