JavaRush /จาวาบล็อก /Random-TH /IntelliJ IDEA และ Debug: ไม่ใช่การดำน้ำ แต่เป็นการดำน้ำตื...
Viacheslav
ระดับ

IntelliJ IDEA และ Debug: ไม่ใช่การดำน้ำ แต่เป็นการดำน้ำตื้น

เผยแพร่ในกลุ่ม
การเขียนโค้ดมีชัยไปกว่าครึ่ง มันยังต้องทำเพื่อให้ทำงานได้อย่างถูกต้อง IDE และเครื่องมือแก้ไขจุดบกพร่องช่วยเราได้มากในเรื่องนี้
IntelliJ IDEA และ Debug: ไม่ใช่การดำน้ำ แต่เป็นการดำน้ำตื้น - 1
เมื่อใช้ IntelliJ IDEA เป็นตัวอย่าง ฉันเสนอให้ทำความคุ้นเคยกับวิธีที่เราจะค้นหาว่าเกิดอะไรขึ้นกับโค้ดของเราเมื่อมันทำงาน การดีบักเป็นหัวข้อกว้างๆ ดังนั้นการรีวิวนี้จึงไม่ได้นำเสนอการดำน้ำลึกเหมือนนักดำน้ำ แต่ฉันหวังว่าจะได้ดำน้ำตื้นอย่างแน่นอน)

การแนะนำ

ส่วนหนึ่งของการเขียนโค้ดคือการดีบักมัน และหากงานของคุณมีการรองรับโค้ด ก็จะมีการดีบักมากยิ่งขึ้น นอกจากนี้ ด้วยความช่วยเหลือในการดีบั๊ก คุณสามารถตรวจสอบการทำงานของไลบรารีและเฟรมเวิร์กที่ใช้งานได้อย่างลึกซึ้งที่สุดเท่าที่คุณจะดำดิ่งลงไปในโค้ดของคนอื่นได้ ในการดำน้ำเราจะต้อง: ขั้นแรก ให้แตกไฟล์เก็บถาวรที่ดาวน์โหลดมาด้วย Quick Start Source Code เปิดตัวแนวคิด IntelliJ และสร้าง " โครงการใหม่จากแหล่งที่มีอยู่ " เลือกไฟล์pom.xml ในไดเร็กทอรี ย่อยhibernate4 เมื่อนำเข้า ให้ระบุ “ นำเข้าโปรเจ็กต์ Maven โดยอัตโนมัติ ” และดำเนินการสร้างโปรเจ็กต์ให้เสร็จสิ้น โดยไม่เปลี่ยนแปลงการตั้งค่าอื่นๆ ขณะที่กำลังนำเข้าโปรเจ็กต์ ให้คลายซิปแอปพลิเคชันเซิร์ฟเวอร์ WildFly ที่ดาวน์โหลดมาลงในไดเร็กทอรีบางส่วน เราเริ่มต้นเซิร์ฟเวอร์โดยใช้ไฟล์(หรือ standalone.sh สำหรับระบบ *nix) (!) สิ่งสำคัญคือต้องเริ่มต้นด้วยพารามิเตอร์ --debug เรารอให้เซิร์ฟเวอร์เริ่มทำงาน พวกเขาจะเขียนถึงเราว่าเริ่มแล้วและระบุเวลา มันจะมีลักษณะดังนี้: bin\standalone.bat
IntelliJ IDEA และ Debug: ไม่ใช่การดำน้ำ แต่เป็นการดำน้ำตื้น - 2
ต่อไปเราจำเป็นต้องรันโปรเจ็กต์ที่เราเลือกบนเซิร์ฟเวอร์ กระบวนการนี้อธิบายไว้ในเอกสารประกอบขนาดเล็กที่สามารถพบได้ในตัวโครงการ: \hibernate4\README.adoc ตามที่ระบุในเอกสารนี้ เราจำเป็นต้องรันคำสั่งในไดเร็กทอรี hibernate4: mvn clean package wildfly:deploy เรากำลังรอข้อความว่าการสร้างเสร็จสมบูรณ์แล้ว:
IntelliJ IDEA และ Debug: ไม่ใช่การดำน้ำ แต่เป็นการดำน้ำตื้น - 3
หลังจากนี้ ในบันทึกเซิร์ฟเวอร์ เราจะเห็นว่าโปรเจ็กต์ใหม่ถูก "ปรับใช้" อย่างไร:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 4
หลังจากนั้นเราไปที่หน้านั้นhttp://localhost:8080/wildfly-hibernate4และควรแสดงหน้าที่มีแบบฟอร์ม “ สมัครสมาชิก ” ดังนั้นการเตรียมการทดลองของเราจึงเสร็จสิ้นและเริ่มได้)) จะมีภาพมากมายรออยู่ข้างหน้าเพื่อความชัดเจน เตรียมตัวให้พร้อม)

ดีบักระยะไกล

ดังนั้นเราจึงจำเป็นต้องกำหนดค่าโหมด Debug เพื่อให้ IDE ของเราควบคุมการเรียกใช้โค้ดบนแอปพลิเคชันเซิร์ฟเวอร์ IntelliJ Idea มีสองเวอร์ชัน: ฟรี (ชุมชน) และจ่ายเงิน (ขั้นสูงสุด) ส่วนหลังสามารถทดลองใช้อย่างเป็นทางการได้ในรูปแบบของ EAP ในเวอร์ชัน Ultimate ทุกอย่างจะง่ายดาย - แอปพลิเคชันเซิร์ฟเวอร์สามารถเปิดใช้งานได้โดยตรงจาก IDE ในโหมดแก้ไขข้อบกพร่อง แต่ในเวอร์ชัน Community คุณต้องทำบางสิ่งด้วยตนเอง ดังนั้นลองพิจารณากรณีที่ซับซ้อนกว่านี้เช่น การตั้งค่าในเวอร์ชันชุมชน เวอร์ชันชุมชนมีข้อจำกัดบางประการ โดยเฉพาะอย่างยิ่ง คุณไม่สามารถเรียกใช้แอปพลิเคชันเซิร์ฟเวอร์จากเซิร์ฟเวอร์ดังกล่าวได้ แต่คุณสามารถตั้งค่าการดีบักระยะไกล (Remote Debug) ได้เมื่อมีเซิร์ฟเวอร์ที่ทำงานอยู่พร้อมแอปพลิเคชันที่เราต้องการแยกจากกัน ลองใช้คำอธิบายของการตั้งค่าจากที่นี่: Remote debug Wildfly ใน IntelliJ Idea community edition (การตั้งค่า Remote Run Configuration สำหรับพอร์ต 8787) หลังจากการกำหนดค่า เราจะเปิดตัวการกำหนดค่าใหม่ในโหมด Debug:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 5
หากทุกอย่างเรียบร้อยดี เราจะเห็นข้อความเกี่ยวกับเรื่องนี้ด้านล่าง:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 6

กระบวนการแก้ไขข้อบกพร่อง

มาตรวจแก้จุดบกพร่องในการบันทึกบันทึกกัน เพื่อที่จะทำสิ่งนี้ได้ เราต้องตัดสินใจก่อนว่าเราจะสำรวจสถานที่ใด ตัดสินจากหน้าต่างเราจำเป็นต้องมีปุ่ม "ลงทะเบียน" ลองค้นหามันในโค้ด ดังนั้นเราจึงต้องมีองค์ประกอบ ซึ่งควรมีข้อความ: "ลงทะเบียน" หรือเธอควรจะมีอะไรเกี่ยวข้องกับมัน คลิกCtrl+Shift+Fและค้นหา ลงทะเบียน ในเครื่องหมายคำพูด เราเห็นว่ามีอยู่อันหนึ่งบน index.xhtml
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 7
กด Enter เพื่อไปยังแหล่งที่พบ:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 8
ดังนั้นเราจะเห็นว่าตอนลงทะเบียน จะมีการเรียก memberController.register เห็นได้ชัดว่านี่ต้องเป็นคลาส Java บางชนิด คลิกCtrl+Nและค้นหา:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 9
แท้จริงแล้วมีชั้นเรียนเช่นนี้ เข้าไปในนั้นกันเถอะ เห็นได้ชัดว่าควรมีวิธีการลงทะเบียน คลิก Ctrl+F12และค้นหาวิธีการลงทะเบียน
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 10
แท้จริงแล้วเราพบมันแล้ว เห็นได้ชัดว่าการ ลงทะเบียนเกิดขึ้นที่นี่ ในmemberRegistration.register กด Ctrl และคลิกที่วิธีการเพื่อ "ตกผ่าน":
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 11
ตอนนี้เรามาตั้งค่า "จุดพัก" หรือจุดพักกันดีกว่า นี่คือเครื่องหมายที่บอกว่าควรหยุดการทำงานของโค้ดไว้ที่ใด ในขณะนี้เราจะมีโอกาสได้เรียนรู้สิ่งที่น่าสนใจมากมาย คุณต้องคลิกตรงบริเวณด้านขวาของหมายเลขบรรทัด
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 12
ในหน้า http://localhost:8080/wildfly-hibernate4 กรอกข้อมูลในช่องต่างๆ แล้วคลิกปุ่มลงทะเบียน ไอคอนไอเดียบนแผงควบคุมจะกะพริบ:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 13
ไปที่ Idea คุณจะเห็นว่ามีข้อมูลที่น่าสนใจมากมายในแผงแก้ไขข้อบกพร่อง:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 14
ที่นี่คุณสามารถดูค่าของฟิลด์ของวัตถุได้ ตัวอย่างเช่น สมาชิกที่ลงทะเบียนประกอบด้วยอะไรบ้าง:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 15
ยอดเยี่ยม. เราทำอะไรได้อีก? เราสามารถเปิดเมนูบริบทและเลือกประเมินนิพจน์ที่นั่น (หรือผ่านเมนูเรียกใช้ -> ประเมินนิพจน์) ยังดีกว่าบนแผงควบคุมดีบักเกอร์:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 16
นี่เป็นความสามารถที่ยอดเยี่ยมที่เบรกพอยต์ โดยสามารถเข้าถึงทุกสิ่งที่จุดโค้ดนั้นสามารถเข้าถึงได้ เพื่อรันโค้ดใดๆ ก็ตามที่สามารถดำเนินการได้ที่จุดนั้น ตัวอย่างเช่น:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 17
นอกจากนี้ยังมีปุ่มควบคุมบนแผงควบคุมดีบักเกอร์ที่รับผิดชอบตำแหน่งที่คุณต้องการย้ายการควบคุมโฟลว์ของโปรแกรม มหัศจรรย์ใช่ไหม) ด้วยการกดปุ่ม F8 (Step Out) เราจะเดินผ่านโค้ดโดยไม่ต้องป้อนวิธีการ ด้วยการกด F9 เราจะหยุดเดินผ่านบรรทัดโค้ดด้วยดีบักเกอร์ และให้ดีบักเกอร์ควบคุมการทำงานของโปรแกรม ถ้าเรากด F7 (Step Into) เราก็จะผ่านรหัสเข้าแต่ละวิธีที่เจอไปตลอดทาง อย่างไรก็ตามให้ความสนใจเป็นพิเศษกับบล็อกข้อมูลนี้:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 18
นี่จะแสดงเธรดที่เราอยู่และวิธีการบนสแต็กของเธรดปัจจุบัน แต่นั่นไม่ใช่ทั้งหมด เพื่อความสะดวกคุณสามารถเปิดแท็บเฟรมได้ หากต้องการทำสิ่งนี้ จะต้องเปิดใช้งาน:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 19
ตอนนี้บนแท็บเฟรม เราเห็นข้อมูลเกี่ยวกับการเปลี่ยนจากวิธีหนึ่งไปอีกวิธีหนึ่ง เนื่องจาก เริ่มเดินผ่านโค้ดโดยใช้ Step Into
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 20
ดังที่เราเห็น เราไม่สามารถถ่ายโอนไปยังตำแหน่งที่โปรแกรมกำลังดำเนินการอยู่ได้เสมอไป ขณะนี้เราอยู่ที่ "getDelegate:469, AbstractEntityManager(org.jboss.as.jpa.container)" แต่ในความเป็นจริงแล้ว เรากำลังดำเนินการอยู่ นี่คือหลักฐานโดยคลาสที่ระบุโดย:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 21
ลองดูที่นี้ อย่างที่เราทราบ มันชี้ไปที่วัตถุปัจจุบัน เราอยู่ที่ TransactionScopedEntityManager เหตุใด Idea จึงไม่สามารถแสดงรหัสให้เราดูได้ ความจริงก็คือปัจจุบัน IntelliJ Idea ไม่ทราบเกี่ยวกับ TransactionScopedEntityManager ใด ๆ เนื่องจาก มันไม่ได้เชื่อมต่อกับโครงการของเรา (ไม่อยู่ในการพึ่งพาโครงการ) เมื่อแอปพลิเคชันเซิร์ฟเวอร์กำลังทำงาน จะมีไลบรารีต่างๆ มากมายที่ทำงานอยู่ภายในนั้น แต่เรารู้น้อยมากเกี่ยวกับพวกเขาเพราะ... โดยทั่วไปเราไม่จำเป็นต้องเจาะลึกถึงระบบภายใน เราแค่ต้องการให้มันใช้งานได้ แต่บางครั้งความสนใจในการทำงานหรือกีฬาก็ต้องการมัน จากนั้น คุณจะต้องแจ้ง Idea เกี่ยวกับไลบรารีนี้ เพื่อจะได้ทราบว่าจะรับรหัสชั้นเรียนได้ที่ไหน

การเชื่อมต่อไลบรารีบุคคลที่สามเพื่อการดีบัก

ก่อนอื่น เราต้องทำความเข้าใจก่อนว่าห้องสมุดประเภทใดที่ต้องเชื่อมต่อ วิธีแรกนั้นยากที่สุด - ค้นหาบนอินเทอร์เน็ต ความเร็วและผลลัพธ์ของการค้นหาผลลัพธ์ขึ้นอยู่กับว่าโครงการได้รับการจัดการได้ดีเพียงใด ตัวอย่างเช่น WildFly มีพื้นที่เก็บข้อมูลแบบเปิด ดังนั้นเมื่อเรา Google “TransactionScopedEntityManager” เราจะไปที่https://github.com/wildfly/wildfly/tree/master/jpa/subsystemและพบว่าเราต้องการ wildfly-jpa วิธีที่สองถูกต้อง เซิร์ฟเวอร์อยู่ที่ไหน ดูที่นั่น วิธีการต่างๆสามารถช่วยได้ ตัวอย่างเช่น บน Windows อาจเป็นFar Manager ด้านล่างนี้เป็นตัวอย่างของอัลกอริทึมการค้นหา เมื่อติดตั้งและเปิดใช้งานแล้ว ให้ใช้Tab เพื่อสลับ ไปที่แท็บใดแท็บหนึ่ง โดยใช้Alt+F1แท็บด้านซ้ายหรือAlt+F2ด้านขวา และเลือกพาร์ติชันที่เราต้องการบนฮาร์ดไดรฟ์ ค่อนข้างเป็นไปได้ที่ไดเร็กทอรี Far Manager นั้นเปิดอยู่ใน Far Manager หลังการติดตั้ง หากต้องการไปที่รูทของดิสก์ ให้Ctrl + \กด ใช้Alt+Fเปิดหน้าต่างค้นหาเริ่มพิมพ์ชื่อไดเร็กทอรีแล้วกด Enter หลังจากพบไดเร็กทอรีแล้ว การค้นหานี้ฉลาดและเน้นไดเรกทอรีที่ตรงกับข้อความค้นหา หากคุณป้อนอักขระที่ไม่มีโฟลเดอร์ จะไม่สามารถป้อนอักขระดังกล่าวได้ วิธีนี้เราจะไปที่ไดเร็กทอรีแอปพลิเคชันเซิร์ฟเวอร์ สมมติว่าเราไม่รู้ว่าโมดูลอยู่ที่ไหนบนเซิร์ฟเวอร์ บางทีนี่อาจเป็นครั้งแรกในชีวิตที่คุณได้ยินเกี่ยวกับ WildFly บางประเภท ดังนั้นคลิกที่นี่ทันทีAlt+F7เพื่อค้นหาไฟล์ ดังนั้นตรรกะจึงกำหนด: เราต้องการไฟล์ที่มีไลบรารี นั่นคือเราต้องการขวดโหล ควรมีคลาส TransactionScopedEntityManager อยู่ภายใน เพราะ class = file จากนั้นมองหา “contains” นั่นคือบางสิ่งเช่นนี้:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 22
ตอนนี้เรามารอผลกัน เขาจะไม่ให้คุณรอ)
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 23
ตอนนี้เราต้องค้นหาซอร์สโค้ดของมันที่ไหนสักแห่ง และมี 2 ตัวเลือก: ลองใช้อันที่สองกันดีกว่า มาหากันที่นั่น:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 24
ตอนนี้เรามาดูการอธิบายการพึ่งพากันต่อไป ในหน้านี้คุณสามารถดาวน์โหลดซอร์สโค้ดได้ เยี่ยมมาก ตอนนี้เราได้ดาวน์โหลดโค้ดแล้ว สิ่งที่เหลืออยู่คือการเชื่อมต่อห้องสมุด มันเชื่อมต่ออย่างง่ายดายมาก เราจำเป็นต้องเปิดการตั้งค่าโครงการ:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 25
ที่นั่นเราเลือก "ไลบรารี" และเพิ่มซอร์สโค้ดที่ได้รับในส่วน "แหล่งที่มา" และในส่วน "คลาส" เราระบุไฟล์ jar ของไลบรารีจากไดเร็กทอรี WildFly ซึ่งเราพบโดยใช้ Far Manager หลังจากนี้ เมื่อเรานำทางผ่าน F7 เราจะเห็นเนื้อหาของคลาส AbstractEntityManager และ TransactionScopedEntityManager และจะพร้อมใช้งานผ่านการค้นหาตามคลาสโดยใช้ Ctrl+N อีกด้วย

เบรกพอยต์แบบมีเงื่อนไข

ตอนนี้กลับมาที่ Break Points กันดีกว่า บางครั้งเราไม่ได้ต้องการหยุดเสมอไป แต่เพียงภายใต้เงื่อนไขบางประการเท่านั้น จะทำอย่างไร? และที่นี่ IDE ของเราก็จะช่วยเราเช่นกัน โดยการวางจุดพัก เราสามารถกำหนดเงื่อนไขให้กับมันได้ ตัวอย่างเช่น ใส่จุดแล้วคลิกขวา:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 26
ตอนนี้เบรกพอยต์จะเริ่มทำงานเมื่อชื่อแม็กซิมิเลียนเท่านั้น เมื่อคลิกปุ่มเพิ่มเติม ชุดการตั้งค่าเพิ่มเติมสำหรับจุดพักจะพร้อมใช้งานสำหรับคุณ

จุดพักบนข้อยกเว้น

บางครั้งเราอาจได้รับข้อผิดพลาดและเราต้องการติดตามที่มาของมัน จากนั้นเราสามารถเพิ่มเบรกพอยต์ได้ไม่ใช่ที่บรรทัดโค้ดเฉพาะ แต่ในตำแหน่งที่ข้อยกเว้นจะถูกส่งออกไป เมื่อต้องการทำเช่นนี้ คุณต้องขยายรายการเบรกพอยต์ทั้งหมด:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 27
และสร้างกฎใหม่สำหรับประเภทข้อยกเว้นที่เลือก:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 28
ตัวอย่างเช่น สำหรับ NPE:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 29

คลาส HotSwap

ดีบักเกอร์เป็นสิ่งมหัศจรรย์ นอกจากการดีบั๊กแล้วยังให้คุณเปลี่ยนคลาสได้อีกด้วย! ใช่ ทรัพยากร (เช่น หน้า xhtml) ไม่สามารถเปลี่ยนแปลงได้อย่างง่ายดาย แต่โค้ดของคลาส Java สามารถถูกแทนที่ได้ทันที (ซึ่งเรียกว่า Hot Swap) ในการดำเนินการนี้ เพียงเปลี่ยนคลาสโดยแนบดีบักเกอร์แล้วดำเนินการ Run -> โหลดคลาสที่เปลี่ยนแปลงใหม่ บทวิจารณ์ที่เป็นประโยชน์ในหัวข้อนี้: 4 วิธีฟรีในการเปลี่ยนโค้ดแบบ hot-swap บน JVM

บทสรุป

ดีบักเกอร์เป็นเครื่องมืออันทรงพลังที่ช่วยให้นักพัฒนาสามารถเจาะลึกลงไปในโค้ดที่รันและศึกษามันในทุกรายละเอียด วิธีนี้ช่วยให้คุณแก้ไขข้อผิดพลาดที่น่าสับสนที่สุดได้ นอกจากนี้ยังช่วยให้คุณเข้าใจวิธีการทำงานของห้องสมุดบางแห่งได้ดียิ่งขึ้น แม้ว่าบทวิจารณ์สั้น ๆ ดังกล่าวจะค่อนข้างน่าประทับใจ แต่ฉันหวังว่ามันจะมีประโยชน์และน่าสนใจ หากใครสนใจเนื้อหานี้ คุณสามารถดำน้ำต่อได้โดยใช้ลิงก์ต่อไปนี้:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 30
#เวียเชสลาฟ
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION