Trong GDB, làm cách nào tôi có thể nhảy trực tiếp lên khung ngăn xếp cuộc gọi cao nhất?


9

Tôi có một chương trình C phân tách lỗi sau khi đi sâu vào một mớ hỗn độn đệ quy vô hạn. Backtracing quá trình trong GDB là vô ích vì khung ngăn xếp cuộc gọi sâu ít nhất 1000 khung và các lệnh gọi hàm lặp lại là một chuỗi bốn lệnh gọi hàm đệ quy phổ biến (vì vậy các điểm dừng dường như vô dụng). Các cuộc gọi lặp đi lặp lại để chỉ đọc lại bốn tên hàm, lặp đi lặp lại. Tôi nhận ra rằng việc thực hiện 'lên' 'lên' 'sẽ giúp tôi tăng cao hơn, vì vậy tôi có thể thấy mô hình này bắt đầu xảy ra ở đâu, nhưng có vẻ như sẽ hiệu quả hơn khi bắt đầu từ cuộc gọi cao nhất Thay vào đó, xếp khung và bước xuống, bởi vì linh cảm của tôi là đệ quy vô hạn bắt đầu sớm trong quá trình. Nếu ngăn xếp cuộc gọi có tổng số N khung, tôi biết tôi chỉ có thể làm

gdb>> up N

để lên đến đỉnh của ngăn xếp (khung thứ N), nhưng vấn đề là tôi không biết N. Có lệnh nào để tìm tổng số khung trong ngăn xếp cuộc gọi không? Hoặc, có một lệnh GDB tích hợp khéo léo để nhảy lên khung hình cao nhất không? Tôi nhận ra rằng khung trên cùng phải là hàm main () - tôi có thể tận dụng kiến ​​thức đó để đến khung trên cùng không?

Câu trả lời:


9

Trong các thử nghiệm của tôi, sử dụng 'lên' với số lượng rất lớn dẫn đến khung hình trên cùng được hiển thị, ví dụ:

(gdb) up 99999
#58 0x0000000000442fb4 in main ()

1
Không hoạt động nếu kích thước ngăn xếp lớn hơn 99999
Vivandiere

Câu trả lời này làm việc cho tôi, chỉ cần sử dụng một số lớn hơn.
tesch1

23

Bạn có thể chỉ định 'bt' với số âm để bắt đầu từ khung trên cùng:

bt -20

Sau đó, bạn có thể sử dụng 'khung' (hoặc 'f') để trực tiếp đến khung bạn muốn.


1

fr 0sẽ đưa bạn đến khung xếp chồng trên cùng. frlà viết tắt của khung.


2
đó là hướng sai
tesch1

@ tesch1 đủ công bằng, nhưng gdb backtrace cho bạn thấy phần dưới cùng trên cùng :)
Vivandiere
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.