จะไฮไลต์และแสดงสี gdb ระหว่างการดีบักแบบโต้ตอบได้อย่างไร


172

กรุณาอย่าตอบฉันควรใช้ ddd, nemiver, emacs, vim หรือส่วนหน้าอื่น ๆ ฉันชอบ gdb ตามที่เป็นอยู่ แต่ต้องการดูผลลัพธ์ด้วยสีเทอร์มินัล


4
มันจะไม่ให้สีกับคุณ (ดังนั้นฉันจะไม่เรียกคำตอบนี้) แต่การกำหนดค่า ~ / .gdbinit บางอย่างจะปรับปรุงประสบการณ์ ฉันใช้สิ่งนี้เป็นค่าต่ำสุดเปลือย: บันทึกประวัติชุดในการพิมพ์ชุดสวยชุดเอาท์พุท
-radix

มันเป็นการดีที่จะเปลี่ยนคำตอบที่ยอมรับเพื่อลบคำตอบเก่าของฉันที่ไม่ถูกต้อง ขอบคุณ
ddaa

เมื่อไฮไลท์สายในปัจจุบันlได้รับการดำเนินการsourceware.org/bugzilla/show_bug.cgi?id=21044ผมก็จะเพิ่มlไปยังhook-stopและป้อน Dev นิพพาน
Ciro Santilli 郝海东冠状病六四事件法轮功

คำตอบ:


183

.gdbinit

คุณสามารถปรับแต่ง~/.gdbinitให้มีสี คุณสามารถใช้สัตว์เลี้ยงลูกด้วยนม.gdbinitซึ่งมีอยู่ที่นี่:

https://github.com/gdbinit/gdbinit

คุณสามารถปรับแต่งได้มากเท่าที่คุณต้องการ ฉันพบสิ่งนี้ต้องขอบคุณคำตอบ SOนี้ นี่คือประเภทของเอาต์พุตที่คุณสามารถรับได้:

.gdbinit

ที่เก็บ GitHub ก็มีให้เช่นกัน: https://github.com/gdbinit/Gdbinit

ในบันทึกด้านความคิดเดียวกันก็ถูกนำไปใช้กับ lldbด้วยเช่นกัน

GDB Dashboard

ตามแนวคิดเดียวกันนี้GDB Dashboardจะมีอินเทอร์เฟซแบบแยกส่วนสำหรับ GDB ใน Python

GDB Dashboard

(void) วอล์คเกอร์

อีกโครงการที่คล้ายกันใช้การสนับสนุน Python ของ GDB เพื่อให้การขยายเพิ่มเติมดังนั้นนี่คือมูลค่าการตรวจสอบ: https://github.com/dholm/voidwalker

@dholm ยังให้บริการ. gdbinitของตัวเองซึ่งได้รับแรงบันดาลใจจากรุ่นก่อนหน้า

(void) วอล์คเกอร์

pwndbg

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

การเปลี่ยน PEDA ในจิตวิญญาณของเพื่อนที่ดีของเราwindbg, ที่เด่นชัดคือpwndbgpwnd-bag

  • ความเร็ว
  • ความยืดหยุ่น
  • รหัสสะอาด

มันมีคำสั่งเพื่อสนับสนุนการดีบักและใช้ประโยชน์จากการพัฒนาคล้ายกับที่มาจาก PEDA และจอแสดงผลที่ดีกว่า (แม้ว่านี่จะไม่ใช่จุดสนใจหลักของโครงการ) ซอฟต์แวร์ยังอยู่ระหว่างการพัฒนาและยังไม่ได้วางจำหน่ายอย่างถูกต้อง

pwndbg

โวล์ท

โครงการคำอธิบายฯ :

Voltron เป็น UI ดีบักเกอร์แบบขยายได้สำหรับแฮกเกอร์ ช่วยให้คุณสามารถแนบมุมมองยูทิลิตี้ที่ทำงานในเทอร์มินัลอื่นไปยังดีบักเกอร์ (LLDB หรือ GDB) ของคุณแสดงข้อมูลที่เป็นประโยชน์เช่นการถอดแยกเนื้อหาสแต็กค่าลงทะเบียน ฯลฯ ขณะที่ยังคงให้ CLI

คุณสามารถแก้ไข.gdbinitเพื่อรวมเข้ากับมันโดยอัตโนมัติ อย่างไรก็ตามการแสดงผลนั้นอยู่นอก GDB (เช่นในการแยก tmux)

โวล์ท

GEF

GEFเป็นอีกทางเลือกหนึ่งและอธิบายไว้ดังนี้:

มันมีวัตถุประสงค์ที่จะใช้เป็นส่วนใหญ่โดยผู้ใช้ประโยชน์และวิศวกรย้อนกลับเพื่อให้คุณสมบัติเพิ่มเติมให้กับ GDB โดยใช้ Python API เพื่อช่วยในระหว่างกระบวนการของการวิเคราะห์แบบไดนามิกและการใช้ประโยชน์จากการพัฒนา

GEF


ขอบคุณมากสำหรับคำตอบของคุณคุณมีความคิดวิธีปิดการลงทะเบียนออกหรือไม่ (ฉันใช้ gdb สำหรับรหัส C ++ และไม่จำเป็นต้องมีระดับแอสเซมเบลอร์ทันที)
vak

ใช่. ประณาม "ความคิดเห็นต้องมีความยาวอย่างน้อย 15 ตัวอักษร"
vak

1
@vak คุณลองset $SHOWCPUREGISTERS = 0หรือยัง โดยทั่วไปคุณจะมีพารามิเตอร์หลายอย่างที่คุณสามารถตั้งค่าได้และคุณสามารถปรับเปลี่ยนรหัสให้เหมาะกับความต้องการของคุณได้เสมอ
BenC

100

มันไม่ได้เป็นสี แต่พิจารณา gdb ของGUI ข้อความ มันสร้างความแตกต่างอย่างมากกับวิธีการใช้ gdb

คุณสามารถเปิดใช้งานด้วย:

gdb -tui executable.out

ภาพหน้าจอ:

ป้อนคำอธิบายรูปภาพที่นี่

อย่างที่คุณเห็นคุณสมบัติหลักคือ:

  • แสดงบรรทัดของแหล่งที่มาที่เราอยู่และบรรทัดโดยรอบ
  • แสดงให้เห็นถึงจุดพัก

5
ว้าว! ขอบคุณ! ฉันกำลังมองหาเชลล์กราฟิกที่สวยงามเป็นเวลานานสำหรับ gdb และฉันได้ลอง xxgdb, kgdb และ ddd แต่ไม่มีใครทำงานได้ดีสำหรับฉันดังนั้นฉันจึงติดอยู่กับอินเตอร์เฟสบรรทัดคำสั่งเก่าแบบธรรมดา แต่มันสมบูรณ์แบบที่สุด!
Thomas Padron-McCarthy

46
Ctrl-x Ctrl-a: ป้อนสิ่งนี้เพื่อสลับไปมาและจากโหมด text gui แม้จะใช้งานได้โดยไม่มีตัวเลือกบรรทัดคำสั่ง
jturcotte

2
การพิมพ์ไปยัง stdout จากโปรแกรมจะแยกส่วนต่อประสานสำหรับฉัน มีวิธีแก้ปัญหาใดนอกจากเปลี่ยนเส้นทางหรือไม่
Ciro Santilli 郝海东冠状病六四事件法轮功

1
ฉันพบปัญหาเดียวกันกับ stdout ที่จะทำลายส่วนต่อประสาน Ctrl-L หรืออะไรก็ตามที่มีผลผูกพันการออกตั๋วใหม่ของคุณทำให้ใช้ได้อย่างน้อย สำหรับผู้ที่เปิดใช้งานโหมดแก้ไข vi, Ctrl-X Ctrl-A ไม่ทำงาน แต่คำสั่ง 'เลย์เอาต์ src' จะทำให้คุณอยู่ในโหมด TUI โดยมีแหล่งที่มาเหมือนภาพ
wilywampa

1
เปิดเทอร์มินัลที่สองจากนั้นออกคำสั่ง: $ tty ใช้ผลลัพธ์เพื่อกำหนด stdout โดยตรงจากเซสชัน gdb ไปยังเทอร์มินัลนั้นโดยใช้ (gdb) ตั้งค่าคำสั่ง inferior-tty อดีต จาก. gdbinit ของฉันตั้งค่า inferior-tty / dev / tty2 ตอนนี้ stdout ของคุณจะไม่เลอะ $ gdb -tui
netskink

46

ฉันรู้ว่าคุณไม่ต้องการส่วนหน้า แต่วิธีการเกี่ยวกับcgdbมันอยู่ใกล้กับ gdb เป็น textmode แต่มีหน้าต่างแหล่งที่มาด้านบนพร้อมกับเน้นไวยากรณ์ในรหัส


2
sudo apt-get install cgdb
cs01

2
Serendipity จริง :)
งมงาย

เพิ่งลองเรียกใช้: ไม่เห็นประวัติ gdb ใด ๆ และยังมีพรอมต์แจ้งเตือนที่มีช่องว่างระหว่างคาเร็ตกับสถานที่จริงที่มีสัญลักษณ์ที่พิมพ์อยู่(น่าจะเป็นเพราะฉันมีพรอมต์สี gdb ) ไม่ประทับใจเลย
สวัสดีแองเจิล

19

เป็นไปได้ที่จะเพิ่มความสวยงามของ gdb ผ่านการใช้สี ทำได้โดยใช้วิธีใดวิธีหนึ่งต่อไปนี้:

  1. Colorized prompt ผ่านทาง "set prompt" เช่นทำให้พร้อมต์เป็นตัวหนาและสีแดง:

    set prompt \033[1;31m(gdb) \033[m

    หรือทำให้พร้อมต์รูปร่างใหม่ตัวหนาและสีแดง:

    set prompt \033[01;31m\n\n#####################################> \033[0m

    ป้อนคำอธิบายรูปภาพที่นี่

  2. คำสั่ง colorized ผ่าน hooks

  3. ไวยากรณ์ที่เน้นสีเป็นสีของคำสั่ง "list"

ตัวอย่างทั้งหมดมีให้ที่โพสต์บล็อกต่อไปนี้เขียนโดย Michael Kelleher:

"Beautify GDB" วันที่ 12 พฤษภาคม 2010 (ผ่าน archive.org)

"การเน้นไวยากรณ์ GDB เชิงทดลอง", 15 พฤษภาคม 2010 (ผ่านทาง archive.org)


14
ลิงก์เสีย
John Carter

7
@ ไมค์: มันจะมีประโยชน์ในการโพสต์เนื้อหาของลิงก์เหล่านั้นที่นี่เนื่องจากเว็บไซต์ไม่สามารถเข้าถึงได้อีกต่อไปและ robots.txt ป้องกันไม่ให้เก็บถาวร.orgจากการจัดทำดัชนี
Lucian Adrian Grijincu

1
คุณสามารถรับข้อมูลที่เกี่ยวข้องได้ที่นี่: sourceware.org/gdb/current/onlinedocs/gdb/Prompt.html
musiphil

1
ขณะนี้ลิงก์ชี้ไปยังแคช archive.org ของบล็อกโพสต์
Alex Quinn

1
@ ไมค์ดูเหมือนว่าคุณเป็นผู้เขียนโพสต์บล็อก ถ้าเป็นเช่นนั้นคุณควรเปิดเผยในคำตอบ
David Z

13

ใหม่ในGDB 8.3 ที่กำลังจะมาถึง!

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=gdb/NEWS

เทอร์มินัลจัดแต่งทรงผมมีให้บริการสำหรับ CLI และ TUI GNU Source Highlight สามารถใช้เพิ่มเติมเพื่อจัดแต่งตัวอย่างของซอร์สโค้ดได้ ดูคำสั่ง "set style" ด้านล่างสำหรับข้อมูลเพิ่มเติม

สกรีนช็อตของ gdb 8.2.91.20190401-23.fc30


คำตอบที่ดีที่สุด! คุณสามารถดูบทแนะนำเกี่ยวกับวิธีการติดตั้งgdb 8.3 medium.com/@simonconnah/ …โปรดทราบว่าเครื่องของคุณต้องมีRAMอย่างน้อย512MBมิฉะนั้นgccคอมไพเลอร์จะเริ่มทิ้ง
ผู้ใช้

7
#into .gdbinit
shell mkfifo /tmp/colorPipe

define hook-disassemble
echo \n
shell cat /tmp/colorPipe | c++filt | highlight --syntax=asm -s darkness -Oxterm256 &
set logging redirect on
set logging on /tmp/colorPipe
end 

define hookpost-disassemble
hookpost-list
end 

define hook-list
echo \n
shell cat /tmp/colorPipe | c++filt | highlight --syntax=cpp -s darkness -Oxterm256 &
set logging redirect on
set logging on /tmp/colorPipe
end 

define hookpost-list
set logging off 
set logging redirect off 
shell sleep 0.1s
end 

define hook-quit
shell rm /tmp/colorPipe
end 

define re
hookpost-disassemble
echo \033[0m
end 
document re
Restore colorscheme
end 

คำเตือน: Buggy ไม่รองรับ TUI แฮ็ค "โหมดผู้ใช้"

พบส่วนหลักที่นี่ และแก้ไขมันเล็กน้อย ต้องเน้น, c ++ filt หากสีเกิดความสับสนคำสั่งให้ออกคำสั่งใหม่


7

cgdb ดีกว่ามาก gdb -tui


ตกลง เส้นอย่างง่ายพิมพ์โดยโปรแกรมของฉัน trashed gdb -tui console สิ่งนี้ไม่ได้เกิดขึ้นภายใต้ cgdb ขอบคุณสำหรับทิป!
Randall Cook


4

ฉันต้องการไฮไลต์ดังนี้เน้นบรรทัดของการติดตามสแต็กซึ่งเป็นของไฟล์ต้นฉบับของฉัน (แทนที่จะเป็นไลบรารี)

ทางออกคือการใช้ gdb-python (บน MSYS; บน Linux มักจะgdbมาพร้อมกับ Python ในตัวแล้ว?), hook backtrace, use

python stack_trace = gdb.execute('backtrace', False, True')

จากนั้นประมวลผลstack_traceด้วย Python regexes แล้วพิมพ์ออกมา ฟังก์ชั่นเช่นนี้: ตัวหนาและสีอื่น ๆ

def term_style(*v):
    """1 is bold, 30--37 are the 8 colours, but specifying bold may also
    change the colour. 40--47 are background colours."""
    return '\x1B['+';'.join(map(str, v))+'m'

#Use like this:
print term_style(1) + 'This will be bold' + term_style(0) #Reset.
print term_style(1,30) + 'This will be bold and coloured' + term_style(0)
print term_style(1,30,40) + 'Plus coloured background' + term_style(0)

ตัวอย่างการทำงานที่ใช้เบ็ด - แม้ว่าจะน้อยที่สุด - อาจเป็นที่น่ายินดีมากกว่า
สวัสดีแองเจิล

4

การผสมสีที่ดีอีกชุดหนึ่งได้รับจากการกำหนดค่านี้ มันทำให้การตรวจสอบ backtraces ง่ายขึ้นมาก หากต้องการใช้งานให้บันทึกไฟล์นั้น~/.gdbinitและเรียกใช้ gdb ตามปกติ


ขอบคุณนี่คือสิ่งที่ฉันกำลังมองหา ฉันมองหาแอพพลิเคชั่นแบบมัลติเธรดที่มีสแต็คการโทรนานและนี่เหมาะสำหรับ backtraces เหล่านั้น
Johan Bjäreholt

-2

คุณสามารถรับสีอะไรก็ได้ที่คุณต้องการ

# gdb
(gdb) shell echo -en '\E[47;34m'"\033[1m"
...
anything is now blue foreground and white background
...
(gdb) shell tput sgr0
... back to normal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.