พิมพ์ Gdb ไปยังไฟล์แทน stdout


105

ฉันใช้ gdb และต้องการตรวจสอบวัตถุเทพเจ้าที่โชคร้ายเหล่านั้น ต้องใช้เวลาหลายหน้า (และฉันมีจอภาพขนาด 24 นิ้วที่หันไปด้านข้าง!) เพื่อดูสิ่งทั้งหมดเพื่อความสะดวกในการใช้งานฉันต้องการให้ gdb พิมพ์วัตถุลงในไฟล์แทนที่จะเป็นหน้าจอเพื่อที่ฉันจะได้เปิดใน vi และเคลื่อนที่ไปมาได้อย่างสะดวกด้วยความเก่งกาจของ gdb ต้องมีวิธีทำใช่ไหม?

คำตอบ:


154

คุณต้องเปิดใช้งานการบันทึก

(gdb) set logging on

คุณสามารถบอกได้ว่าจะใช้ไฟล์ใด

(gdb) set logging file my_god_object.log

และคุณสามารถตรวจสอบการกำหนดค่าการบันทึกปัจจุบันได้

(gdb) show logging

16
และถ้าคุณต้องการให้ผลลัพธ์ไปที่ไฟล์บันทึกเท่านั้นให้ใช้set logging redirect on.
Ben C

6
เราไม่ควรตั้งset logging file my_god_object.logก่อนset logging on?
Herpes Free Engineer

สิ่งนี้บวกtail -fและawkเป็นประโยชน์จริงๆในวันนี้ ขอบคุณ!
ซ่อมรถ

13

ฉันพบว่าคุณสามารถเปลี่ยนเส้นทางเอาต์พุตจาก gdb ไปยังไฟล์ผ่านrunคำสั่ง:

(gdb) run > outfile

12
นั่นจะเป็นผลลัพธ์จากโปรแกรมที่ถูกดีบักไม่ใช่ผลลัพธ์จาก gdb เอง OP ต้องการบันทึกเอาต์พุตของ gdb เอง
พอล


@thepaul แต่อันที่จริงนี่มีประโยชน์มากเพราะฉันกำลังดีบักโปรแกรม QT ที่เพิ่งทำลาย stdin ของ gdb ด้วยขยะ
QDebug

@ rostamn739 อ๊ะไม่ได้ช่วยเลย
rostamn739

12

ขยายคำตอบของ @ qubodup

gdb core.3599 -ex bt -ex quit |& tee backtrace.log

-exสวิตช์ทำงานคำสั่ง gdb ดังนั้นข้างต้นจะโหลดไฟล์หลักเรียกใช้btคำสั่งแล้วจึงquitสั่ง เอาต์พุตถูกเขียนไปbacktrace.logยังและบนหน้าจอด้วย

การเรียกใช้ gdb ที่มีประโยชน์อีกอย่างหนึ่ง (ให้ stacktrace กับตัวแปรโลคัลจากเธรดทั้งหมด) คือ

gdb core.3599 -ex 'thread apply all bt full' -ex quit

ในบางระบบคุณต้องพิมพ์gdb -c core.3599 ...
user7610

1
> gdb core.3599 -ex 'thread ใช้ bt เต็มทั้งหมด' -ex ออกจาก Add - batch เพื่อรันโดยไม่ต้องแจ้ง -eg sudo gdb - batch core 3599 -ex 'thread ใช้ bt เต็มทั้งหมด' -ex ออก> เอาต์พุต .log
David Skelly

10

จากhttps://sourceware.org/gdb/onlinedocs/gdb/Logging-Output.html :

คุณอาจต้องการบันทึกผลลัพธ์ของคำสั่ง gdb ลงในไฟล์ มีหลายคำสั่งเพื่อควบคุมการบันทึกของ gdb

set logging on

เปิดใช้งานการบันทึก

set logging off

ปิดใช้งานการบันทึก

set logging file file

เปลี่ยนชื่อของไฟล์บันทึกปัจจุบัน ไฟล์บันทึกเริ่มต้นคือ gdb.txt

set logging overwrite [on|off]

ตามค่าเริ่มต้น gdb จะต่อท้ายไฟล์บันทึก ตั้งค่าการเขียนทับหากคุณต้องการตั้งค่าการเข้าสู่ระบบเพื่อเขียนทับไฟล์บันทึกแทน

set logging redirect [on|off]

ตามค่าเริ่มต้นเอาต์พุต gdb จะไปที่ทั้งเทอร์มินัลและไฟล์บันทึก ตั้งค่าการเปลี่ยนเส้นทางหากคุณต้องการให้เอาต์พุตไปที่ไฟล์บันทึกเท่านั้น

show logging

แสดงค่าปัจจุบันของการตั้งค่าการบันทึก


2
คัดลอกวางsourceware.org/gdb/onlinedocs/gdb/Logging-Output.htmlโดยไม่มีการอ้างอิง
Herpes Free Engineer

5

วิธีง่ายๆในการบันทึก gdb ไปยังไฟล์ในขณะที่ยังคงเห็นผลลัพธ์ (ซึ่งช่วยให้การเขียนคำสั่งง่ายขึ้น) คือการใช้tee:

gdb command |& tee gdb.log

1

แม้ว่าจะมีคำตอบที่ดีมากมายที่นี่ แต่ฉันก็ยังต้องโพสต์สิ่งเดียวที่เหมาะกับฉัน:

[niko@my-laptop]# gdb MyBinary 2>&1 log.txt

นี่เป็นวิธีเดียวที่จะรับ gdb และ binary output ลงในไฟล์ log.txt เดียวกันในขณะที่ยังเห็นมันบนคอนโซล

แก้ไข:

ข้อควรระวัง:ดูเหมือนว่าเอาต์พุตจะไม่ซิงค์บางส่วนระหว่างเอาต์พุต gdb และเอาต์พุตไบนารี มีใครยืนยันได้ไหม คุณอาจต้องการตรวจสอบว่าไคลเอ็นต์ telnet / ssh ของคุณมีฟังก์ชันบันทึกเอาต์พุตที่คุณเห็นในคอนโซลหรือไม่


1

คุณมีคำตอบหลายข้อที่นี่ พวกเขาถูกต้อง ฉันแค่ต้องการเพิ่มคำสั่งที่จะช่วยให้คุณรวบรวมผลลัพธ์ทั้งหมดในครั้งเดียว สิ่งนี้มีประโยชน์มากเมื่อคุณรวบรวมข้อมูลย้อนกลับขนาดใหญ่ ก่อนดำเนินการกำหนดค่าการบันทึกให้ดำเนินการดังนี้:

(gdb)set height 0

ฉันพบในบทความนี้: https://askaralikhan.blogspot.com/2016/05/gdb-all-threads-bt-to-file.html?showComment=1584614942454#c4584028195226351332

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