มีโปรแกรมแก้ไขจุดบกพร่องแบบโต้ตอบของ golang หรือไม่ [ปิด]


85

ชื่อเรื่องนี้สรุปได้ค่อนข้างดี ฉันกำลังลองใช้ Go และฉันพลาดจริงๆที่จะสามารถกำหนดจุดพักและก้าวเข้า / ออก / ออกได้มากเท่าที่ฉันต้องการภายในสภาพแวดล้อมแบบโต้ตอบ ฉันรู้ว่าฉันสามารถใช้ gdb เพื่อ debug Go ได้ แต่มันค่อนข้างน่ารำคาญเมื่อเทียบกับการใช้ IDE ที่สามารถเสียบเข้ากับ gdb เพื่อทำการเบรกพอยต์

ฉันลองค้นหาหนึ่งรายการและพบเฉพาะปลั๊กอินหรือ IDE ขนาดเล็กที่มีการเน้นไวยากรณ์ แต่ไม่มีการดีบัก


สำหรับใครก็ตามที่ตอบคำถามนี้โปรดตรวจสอบคำตอบอื่น ๆ ไม่ใช่แค่คำตอบ (ที่ยอมรับในปัจจุบัน) เกี่ยวกับ GDB
Leigh

คำตอบ:


38

อัปเดต : โดยส่วนตัวแล้วในขณะที่ GDB ทำงานฉันไม่ใช่แฟนของการใช้งานใน Go และจะทำให้คุณกระอักเลือด ตรวจสอบคำตอบอื่น ๆ สำหรับทางเลือกที่ดี


ใช่แน่นอน :)

Go มีดีบักเกอร์ (GDB)

นี่คือบทแนะนำอย่างเป็นทางการเกี่ยวกับวิธีการใช้งาน

หากคุณต้องการ 'การดีบักแบบกราฟิก' (นั่นคือการตั้งค่าเบรกพอยต์ในตัวแก้ไข) IDE บางตัวจะให้คุณทำเช่นนั้นได้ (โดยมี GDB อยู่เบื้องหลัง)

โดยเฉพาะ Eclipse, LiteIDE และ Zeus ทั้งหมดให้คุณตั้งค่าเบรกพอยต์และดีบักจากสภาพแวดล้อมการเข้ารหัส(ต้นทาง) ของคุณ นี่คือวิดีโอเกี่ยวกับวิธีที่จะทำกับ Zeus


2
จากการติดตามผลฉันใช้ Mac และฉันพบว่าปลั๊กอิน IntelliJ go ทำให้การพัฒนาทำได้ดีและง่ายมาก แต่ LiteIDE นั้นยอดเยี่ยมมากในการดีบั๊ก (แม้ว่าจะไม่สมบูรณ์แบบ แต่ก็ใช้งานได้ดี) ฉันต้องติดตั้ง GDB ที่อัปเดตเพื่อให้มันใช้งานได้ซึ่งเป็นเรื่องที่เจ็บปวด
Daniel Williams

4
มีปัญหามากมายและจะไม่ได้รับการสนับสนุนจากทีม go ในอนาคต (นอกเหนือจากฟังก์ชันพื้นฐาน) โปรดดูคำตอบของฉันด้านล่าง
metakeule

GDB ล่มสลายเมื่อหลายปีก่อนและไม่สามารถใช้งานได้อีกต่อไป คำตอบที่ได้รับการยอมรับนั้นผิดโดยสิ้นเชิง
Michele Giuseppe Fadda

@ user4839438 เอ่อสองบรรทัดแรกคือ "อย่าใช้ gdb ระหว่างเดินทาง" ฉันใช้เป็นการส่วนตัวgodebugซึ่งครั้งสุดท้ายที่ฉันไปก็ค่อนข้างดี
Benjamin Gruenbaum

คุณพูดถูก แต่ชื่อเรื่องว่า"Go has a debugger (gdb)"ซึ่งจริงๆแล้วไม่เป็นความจริงอีกต่อไปและปัจจุบันเป็นความเสียหาย GDB เคยทำงานร่วมกับ golang เวอร์ชันเก่าโดยพยายามทำให้มันใช้งานได้เป็นไฟลนก้นตัวใหญ่และในที่สุดมันก็ไม่ได้ผลและไม่สามารถใช้งานได้ ฉันเป็นลูกสุนัขที่มีความสุขกับ Dwelve ฉันจะลองgodebugด้วย
Michele Giuseppe Fadda

29

การสนับสนุน GDB สำหรับ go มีปัญหามากมายที่ทีม go ไม่ได้รับการแก้ไข

สำหรับข้อมูลเพิ่มเติมโปรดอ่านโพสต์โดย Rob Pike :

แม้ว่าเราจะพยายามรักษาฟังก์ชัน gdb พื้นฐานไว้ (สแต็กเทรซ, ค่าการพิมพ์) ให้ทำงานบนแพลตฟอร์มที่รองรับ แต่ความสามารถในการใช้ดีบักเกอร์เพื่อทำความเข้าใจสภาพแวดล้อมทั้งหมดของโปรแกรม Go อาจไม่ได้ผลและการปรับปรุงการสนับสนุน gdb ไม่ใช่สิ่งสำคัญสำหรับทีม .

พวกเขากำลังมองหาตัวเลือกการดีบักอื่น ๆ แต่ยังไม่มีแผนการที่เป็นรูปธรรมในตอนนี้ เอกสารประกอบล้าสมัยและruntime-gdb.pyสคริปต์ที่มาพร้อมกับ go 1.2 ใช้ไม่ได้กับ GDB ที่คอมไพล์ด้วยการสนับสนุน python3 (เช่น Ubuntu ปัจจุบัน)


25
นั่นไม่มั่นใจสำหรับภาษาที่เริ่มนำมาใช้ในขณะนี้
Valerio

2
@ ValerioColtrèฉันไม่เคยต้องการดีบักเกอร์เลย การทดสอบหน่วยและ Printf ("% # v", ... ) ให้บริการฉันเป็นอย่างดีจนถึงตอนนี้ ...
metakeule

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

จากเอกสาร GDB: "GDB ไม่เข้าใจโปรแกรม Go อย่างดีการจัดการสแต็กเธรดและรันไทม์มีลักษณะที่แตกต่างกันมากพอจากโมเดลการดำเนินการที่ GDB คาดว่าพวกเขาสามารถสร้างความสับสนให้กับดีบักเกอร์ได้แม้ว่าโปรแกรมจะคอมไพล์กับ gccgo ก็ตาม ผลที่ตามมาแม้ว่า GDB จะมีประโยชน์ในบางสถานการณ์ แต่ก็ไม่ใช่ดีบักเกอร์ที่เชื่อถือได้สำหรับโปรแกรม Go โดยเฉพาะโปรแกรมที่ทำงานพร้อมกันอย่างหนัก "
masukomi

Go ทำงานร่วมกับดีบักเกอร์อย่างไร "เราได้พูดคุยเกี่ยวกับโปรแกรมแก้ไขข้อบกพร่อง Go ที่กำหนดเองมาระยะหนึ่งแล้ว แต่ยังไม่มีเลย" โดย Russ Cox
Ivan Chau

24

ปรับปรุง 2017: โครงการ godebug กล่าวถึงด้านล่างอยู่ในขณะนี้อย่างเป็นทางการแทนที่ด้วยderekparker / เจาะ


คำตอบเดิม:

ตอนนี้คุณ (มีนาคม 2015) มีแนวทางอื่นขึ้นอยู่กับการใช้รหัส

mailgun / godebug :

godebugใช้แหล่งที่มาของการสร้างรหัสเครื่องดนตรีโปรแกรมของคุณกับสายการแก้จุดบกพร่อง
go tool coverใช้แนวทางที่คล้ายกันในการครอบคลุมรหัส

  • เมื่อคุณเรียกใช้โปรแกรมgodebugจะแยกวิเคราะห์โปรแกรมของคุณการเรียกใช้ฟังก์ชันการทำงานของเครื่องมือการประกาศตัวแปรและบรรทัดคำสั่งและส่งออกโค้ดผลลัพธ์ที่ใดที่หนึ่ง (ปัจจุบันเป็น stdout หรือแทนที่ไฟล์ต้นฉบับของคุณ)
  • เมื่อคุณเรียกใช้โค้ดที่แก้ไขนี้โดยสมมติว่าคุณวางเบรกพอยต์ไว้ที่ใดที่หนึ่งคุณสามารถก้าวผ่านมันและตรวจสอบตัวแปรได้

มาในภายหลัง: ประเมินนิพจน์ Go โดยพลการและเขียนถึงตัวแปร


อัปเดตมิถุนายน 2558:

แม้ว่าอาจจะไม่สามารถโต้ตอบได้อย่างที่ "บางคน" หวัง แต่ก็ยังได้รับการชื่นชม (และมีคุณลักษณะ "ก้าวเข้าสู่" )
ดู " Go มีดีบักเกอร์ - และมันยอดเยี่ยมมาก! " (Cloudfare)

นี่คือสิ่งที่น่าสนใจ: แทนที่จะต่อสู้กับptraceอินเทอร์เฟซที่แตกต่างกันครึ่งโหลที่ไม่สามารถพกพาได้ให้godebugเขียนซอร์สโค้ดของคุณใหม่และอัดการเรียกฟังก์ชันเหมือนgodebug.Lineในทุกบรรทัดgodebug.Declareทุกครั้งที่ประกาศตัวแปรและgodebug.SetTraceสำหรับเบรกพอยต์ (เช่นทุกที่ที่คุณพิมพ์_ = "breakpoint")

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

เมื่อถึงจุดพักโปรแกรมจะหยุดการทำงานแบบอินไลน์และรอคุณอยู่บน stdin

มันเป็นปรัชญาการพึ่งพาศูนย์เดียวไบนารีที่เราชอบนำไปใช้กับการดีบัก สร้างได้ทุกที่ทำงานได้ทุกที่โดยไม่ต้องใช้เครื่องมือหรือสิทธิ์บนเซิร์ฟเวอร์

ifdef GODEBUG  
    GOPATH="${PWD}" go install github.com/mailgun/godebug
    GOPATH="${PWD}" ./bin/godebug build -instrument "${GODEBUG}" -o bin/rrdns rrdns

การดีบักอยู่make bin/rrdns GODEBUG=rrdns/...ห่างออกไปเพียงไม่นาน


Godebug เลิกใช้แล้วและแนะนำให้ใช้ Delve แทน
Alexandro de Oliveira

@AlexandrodeOliveira ขอบคุณค่ะ ฉันได้อัปเดตคำตอบตามนั้น
VonC

ลองเจาะลึกดูเหมือนจะทำงานได้ดี สำหรับฉันคำตอบของเครื่องมือโอเพนซอร์สที่ดีนี้ทำให้คำถาม "ไม่ตรงประเด็น" น้อยลง ฉันไม่ต้องการให้คะแนนเครื่องมือปิด บางทีคำถามอาจต้องได้รับการปฏิเสธ แต่ฉันได้ยินมาว่ากำลังค้นหาทางเลือกอื่นสำหรับ gdb หลังจากพบ (gdb) ไม่แนะนำให้ใช้จริงๆ
Gerry Gleason

15

อัพเดท:

ฉันได้ตรวจสอบแล้วและยินดีที่จะรายงานว่า Version: 2016.1.3, Build: 145.1617.8, Released: 5 มิถุนายน 2016 ทำงานร่วมกับ Delve! คุณสามารถดาวน์โหลดได้ที่นี่: https://www.jetbrains.com/idea/download/ ปฏิบัติตามคำแนะนำในการติดตั้ง Delve ที่นี่: https://github.com/derekparker/delve/tree/master/Documentation/installation

มันเป็นขุยเล็กน้อย หลังจากที่ฉันได้รับพรอมต์การเข้าสู่ระบบ OSX การดีบักแบบโต้ตอบก็เริ่มทำงาน บางครั้งฉันต้องดีบักโปรแกรม. go ง่ายๆเพื่อเริ่มต้น แต่มันใช้งานได้และเป็นประสบการณ์การดีบักแบบโต้ตอบที่ดีที่สุดสำหรับ Go ที่ฉันเคยเห็น

โพสต์เดิม:

มีโปรแกรมแก้ไขจุดบกพร่องแบบโต้ตอบของ golang หรือไม่ ใช่.

ดีบักเกอร์แบบโต้ตอบของ golang ที่น่าใช้มีอยู่จริงหรือไม่? ไม่

การกำหนดค่า GDB บน ​​Mac นั้นน่าเบื่อ แต่ก็ทำได้

อย่างไรก็ตามเมื่อคุณเริ่มใช้งานคุณจะรู้ทันทีว่าคุณเสียเวลาไปกับการติดตั้ง

คุณสามารถกำหนดค่า IntelliJ เพื่อใช้งานได้

ค่าเดียวที่ IntelliJ, LiteIDE, CGDB และอื่น ๆ มีให้คือคุณสามารถตรวจสอบได้เร็วขึ้นว่าการสนับสนุนการดีบัก GDB สำหรับ Go นั้นแย่มาก

คุณสามารถใช้เพื่อดูโค้ด Go ได้ แต่พยายามพิมพ์ค่าของสิ่งอื่นที่ไม่ใช่ค่าตัวแปรที่เรียบง่ายมาก ๆ แล้วคุณจะเสียเวลาไปกับการหาดีบักเกอร์ที่เหมาะสม

นี่คือตัวอย่างของสิ่งที่เกิดขึ้นเมื่อคุณพยายามพิมพ์ค่าของโครงสร้างข้อมูลสตริงแผนที่ [สตริง] โดยใช้ CGDB:

(gdb) print params
$1 = (github.com/go-martini/martini.Params) 0x15582 <runtime.reentersyscall+450>

... ซึ่งไร้ประโยชน์อย่างสิ้นเชิง

จากนั้นลองทำดังนี้

(gdb) print params["UserID"]

... และคุณจะได้รับ "Bus error"

Delve ( https://github.com/derekparker/delve ) มีแนวโน้มดีเนื่องจากเขียนด้วย Go แต่คุณขับโดยใช้คอนโซลไม่ใช่ผ่าน IDE

ฉันยินดีจ่ายสำหรับ IntelliJ เวอร์ชันองค์กร (หรือ IDE อื่น ๆ ) ที่ทำงานได้ดีรองรับการดีบักแบบโต้ตอบใน Go

ณ ตอนนี้fmt.Printf("%v", variable)ดีพอ ๆ กับที่ได้รับ


ไม่อีกแล้ว! คำตอบที่ล้าสมัย
Michele Giuseppe Fadda

mailgun / godebug เป็นการปรับปรุงมากมาย น่าใช้. อย่างไรก็ตามสิ่งที่ควรค่าแก่การใช้เป็นอย่างมากคือ IDE ที่มีตัวดีบักแบบโต้ตอบแบบบูรณาการ การดีบักจากคอนโซลชวนให้นึกถึงการดีบักในยุค 80 การเพิ่มเครื่องมือในรหัส Go ของฉันใช้งานได้ แต่เป็นการรบกวนเล็กน้อย ฉันต้องการเพียงแค่ (ยกเลิก) คลิกที่แถวของโค้ดเพื่อ (ยกเลิก) ตั้งค่าเบรกพอยต์
l3x

ฉันจะเรียกคืน ... dvelve debugger + intelliJ idea IDE.!
Michele Giuseppe Fadda

สวัสดีผู้ใช้ 4839438 ฉันเพิ่งสังเกตเห็นโพสต์ของคุณ จะลองดู. หากได้ผลแน่นอนว่าจะต้องจ่ายค่าธรรมเนียมการอัพเกรด JetBrains ไม่ใช่ว่ามันสำคัญสำหรับฉัน แต่ฉันได้ยินมาว่าดีบักเกอร์ Delve ควรจะทำงานใน MS Visual Studio ดูmarketplace.visualstudio.com/items/lukehoban.Go
l3x

1
ฉันได้ตรวจสอบแล้วและยินดีที่จะรายงานว่า Version: 2016.1.3, Build: 145.1617.8, Released: 5 มิถุนายน 2016 ทำงานร่วมกับ Delve! คุณสามารถดาวน์โหลดได้ที่นี่: jetbrains.com/idea/download ปฏิบัติตามคำแนะนำในการติดตั้ง Delve ที่นี่: github.com/derekparker/delve/tree/master/Documentation/…
l3x

9

แก้ไข

ตอนนี้ GO ดีบักเกอร์เป็นปลั๊กอินง่ายๆใน IntelliJ หรือ PyCharm โดยไม่จำเป็นต้องติดตั้งอะไรอีก เพียงแค่มองหาปลั๊กอิน Go ในการตั้งค่าปลั๊กอิน

คำตอบเดิม (พ.ย. 2015)

สำหรับผู้ที่กำลังมองหาข้อมูลล่าสุด ณ สิ้นเดือนพฤศจิกายน 2558:

รับเจาะลึก

https://github.com/derekparker/delve

และทำตามคำแนะนำการสร้าง / การตั้งค่า:

https://github.com/derekparker/delve/wiki/Building

รับ IntelliJ (15) หรือ PyCharm ล่าสุด (5)

https://www.jetbrains.com/idea/download/

และรับ go-lang-plugin ใน IDE ที่คุณเลือก:

Pycharm -> Preference -> plugins -> search for go
current version is Version: 0.10.749
IntelliJ -> Preference -> plugins -> search for go
current version is Version: 0.10.749
  1. ตั้งค่าโครงการ Go ใหม่หรือนำเข้าโครงการ
  2. ตั้งค่า Go SDK ของคุณตามที่แจ้ง
  3. ตั้งค่าห้องสมุด Go ของคุณ (โดยปกติจะอยู่ใน GOROOT / src
  4. ตั้งค่าการกำหนดค่า Run Application ที่มุมบนขวาโดยไอคอน 'play':
  5. แก้ไขการกำหนดค่า -> คลิก + -> ไปที่แอปพลิเคชัน

กำหนดแพ็กเกจหรือไฟล์ที่จะเรียกใช้

เมื่อตั้งค่าเสร็จแล้วไอคอน Play และไอคอน Debug ควรใช้งานได้แล้วและคุณสามารถตั้งค่าเบรกพอยต์นาฬิกา ฯลฯ ... ได้ตามปกติ

ไชโย


ประเมิน / ดูไม่ได้ผลสำหรับฉัน: ไม่พบค่าสัญลักษณ์สำหรับ ... คุณช่วยแก้ปัญหานี้ให้คุณได้ไหม
Stefan Wuthrich - Altafino

ดูและประเมินดูเหมือนจะใช้งานได้ดีสำหรับฉันใน PyCharm 5.0.3 CE และ IntelliJ IDEA 15.0.2
MrE

จริงๆแล้วคุณไม่จำเป็นต้องสร้าง delve ปลั๊กอินจะมาพร้อมกับมันโดยอัตโนมัติ
dlsniper

@dlsniper ล่าสุดนี้? เมื่อฉันลองฉันติดตั้งปลั๊กอิน go มาระยะหนึ่งแล้วฉันอัปเกรด แต่มันใช้ไม่ได้จนกว่าฉันจะสร้าง delve
MrE

@MrE delve ได้รับการจัดส่งมาพร้อมกับปลั๊กอินเนื่องจากมีการรวมเข้าด้วยกันซึ่งประมาณ 3 เดือนที่แล้ว แต่ใช้งานได้เฉพาะบน Linux และ Mac OS X ทั้ง 64 บิต
dlsniper


7

IDE DEBUG ON GO เป็นไปได้ (อีกครั้ง) ใช้งานได้จริง !

Delveทำงานได้ดีบน Mac OS X และรองรับปลั๊กอินIntelliJ IDEA Go Langปลั๊กอินไปหลังสวน

ฉันทดสอบบน Mac OSX, IntelliJ Idea 14, Go 1.5.1, Delve 0.5

ฉันต้องเรียกใช้ผ่านลูปปกติของการสร้างใบรับรองที่ลงนามด้วยตนเองเพิ่มลงในวงแหวนระบบ ฯลฯ (จำเป็นเพื่อเรียกใช้ดีบักเกอร์ใน Mac OS X) ในตอนท้ายฉันตั้งค่าโครงการ GO ภายใน IntelliJ และได้รับการชำระคืนในการกู้คืนคุณสมบัติการดีบักเกอร์ IDE + ตามปกติ: การตั้งค่าเบรกพอยต์การตรวจสอบตัวแปรการก้าวเดียว

นั่นเป็นวิธีที่ดีกว่าการพิมพ์ค่าเพื่อแก้จุดบกพร่องโค้ด


คุณสามารถอธิบายวิธีตั้งค่ากับ IntelliJ ได้หรือไม่? ดีบักเกอร์ต้องรันเป็นปลายทาง HTTP ใช่หรือไม่
MrE

ไม่เป็นไร ... พบเอกสาร ฯลฯ ... แต่เห็นได้ชัดว่าต้องใช้ PyCharm หรือ IntelliJ เวอร์ชันล่าสุดเพื่อทำงานนอกกรอบ
MrE

ฉันไม่ได้ทำอะไรเป็นพิเศษฉันเพิ่งติดตั้ง Dvelve และ intelliJ 14 มันยังทำงานได้อย่างถูกต้องกับ IntelliJ 15 เกี่ยวกับเวอร์ชันก่อนหน้า: ฉันไม่รู้
Michele Giuseppe Fadda

7
  1. ตัวเลือกที่หนึ่ง - GDB https://golang.org/doc/gdb

  2. Delve

  3. Visual Studio Codeพร้อมปลั๊กอิน go (ยังคงใช้ delve)

ฉันใช้ตัวเลือก 3 เป็นการส่วนตัวสำหรับมันคุณจะต้องติดตั้งdelve

วิดีโอนี้แสดงการแก้ไขจุดบกพร่อง: https://youtu.be/uBjoTxosSys?t=16m11s (วิดีโอทั้งหมดน่าสนใจมาก)


Delve ล้าหลัง แต่ก็ยังดีกว่า IMO อื่น ๆ
Ostati

1
IMO นี้คือคำตอบที่ดีที่สุด ตัวเลือก # 3 ยังเป็นโซลูชันหลายแพลตฟอร์ม Delve มีข้อ จำกัด บางประการ แต่การดีบักภาพขั้นพื้นฐานทำงานได้ค่อนข้างดี
gideon

1

ฉันค่อนข้างมีความสุขกับ Gogland ( https://www.jetbrains.com/go/ ) ซึ่งโดยพื้นฐานแล้ว Intellij พร้อมการสนับสนุน Go มีตัวดีบักเกอร์ที่ใช้งานได้ดีขึ้นเรื่อย ๆ เมื่อพวกเขาพัฒนาสิ่งนี้ ฉันใช้มันมาตั้งแต่มกราคม 2017 และส่วนใหญ่เสถียรสำหรับฉันใน MBP 2016

Goland เป็นชื่อรหัสสำหรับ IDE เชิงพาณิชย์ใหม่โดย JetBrains ที่มุ่งสร้างสภาพแวดล้อมตามหลักสรีรศาสตร์สำหรับการพัฒนา Go


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