ใน GDB ฉันจะข้ามไปยังเฟรมสแต็คการโทรสูงสุดโดยตรงได้อย่างไร


9

ฉันมีโปรแกรม C ที่แยกส่วนข้อผิดพลาดหลังจากที่ลงลึกเข้าไปในระเบียบซ้ำซ้ำ การเคลื่อนย้ายกระบวนการใน GDB นั้นไร้ประโยชน์เนื่องจาก call stack frame มีความลึกอย่างน้อย 1,000 เฟรมและการเรียกฟังก์ชันซ้ำเป็นชุดของการเรียกฟังก์ชัน recursive ทั่วไปสี่ชุด (ดังนั้นจุดพักดูเหมือนจะไร้ประโยชน์) การเรียกซ้ำไปยัง backtrace เพียงแค่อ่านชื่อฟังก์ชั่นทั้งสี่ชื่อซ้ำแล้วซ้ำอีก มันเกิดขึ้นกับฉันว่าการทำ 'up' 'up' 'up' ... จะทำให้ฉันสูงขึ้นดังนั้นฉันจะได้เห็นว่ารูปแบบนี้เริ่มต้นเกิดขึ้นครั้งแรก แต่ดูเหมือนว่ามันจะมีประสิทธิภาพมากกว่าที่จะเริ่มต้นจากการโทรสูงสุด stack frame และ step down แทนเนื่องจากลางสังหรณ์ของฉันคือการเรียกซ้ำแบบไม่สิ้นสุดเริ่มต้นในกระบวนการ หาก call stack มี N frames ทั้งหมดฉันรู้ว่าฉันทำได้

gdb>> up N

เพื่อไปที่ด้านบนของสแต็ค (เฟรม Nth) แต่ปัญหาคือฉันไม่รู้ N มีคำสั่งสำหรับการค้นหาจำนวนเฟรมทั้งหมดในสแต็กการโทรหรือไม่ หรือมีคำสั่ง GDB ในตัวที่ลื่นไหลสำหรับการกระโดดไปที่เฟรมสูงสุดหรือไม่? มันเกิดขึ้นกับฉันว่าเฟรมบนสุดควรเป็นฟังก์ชั่นหลัก () - ฉันสามารถใช้ความรู้นั้นเพื่อไปยังเฟรมสูงสุดได้หรือไม่?

คำตอบ:


9

ในการทดสอบของฉันการใช้ 'up' ด้วยจำนวนที่มากทำให้เฟรมด้านบนสุดถูกแสดงเช่น

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

1
ไม่ทำงานหากขนาดสแต็คมากกว่า 99999
The Vivandiere

คำตอบนี้ใช้ได้สำหรับฉันแค่ต้องการใช้จำนวนที่มากขึ้น
tesch1

23

คุณสามารถระบุ 'bt' ด้วยจำนวนลบเพื่อเริ่มจากเฟรมสูงสุด:

bt -20

จากนั้นคุณสามารถใช้ 'เฟรม' (หรือ 'f') เพื่อไปยังเฟรมที่คุณต้องการโดยตรง


1

fr 0จะนำคุณไปสู่กรอบสแต็คที่สูงที่สุด frย่อมาจากกรอบ


2
นั่นคือทิศทางที่ผิด
tesch1

@ tesch1 ยุติธรรมมากพอ แต่ gdb backtrace แสดงให้คุณเห็นว่าอยู่ด้านบนสุด :)
The Vivandiere
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.