จะค้นหาซอร์สโค้ดที่ใช้คุณสมบัติบางอย่างได้อย่างไร [ปิด]


14

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

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

แต่คุณจะทำสิ่งนี้ในแอปพลิเคชันบนเดสก์ท็อปได้อย่างไร อย่างน้อยไม่ต้องดำดิ่งสู่ codebase แบบเต็ม?


6
แทนที่จะอ่านรหัสบางครั้งคุณสามารถใช้ดีบักเกอร์ได้ วิธีการทำงาน (และวิธีที่ใช้งานง่ายสำหรับคุณ) ขึ้นอยู่กับภาษาดีบักเกอร์และอินเทอร์เฟซการดีบักเกอร์ที่ใช้ ไม่ว่าในกรณีใดการใช้ดีบักเกอร์เป็นศิลปะที่ต้องเรียนรู้ - แต่เมื่อรู้แล้วมันเป็นเครื่องมือที่ทรงพลังมาก ฉันควรเรียนรู้ที่จะใช้ด้วยตัวเองในบางครั้ง
amon

และฉันควรตั้งจุดพักที่ไหน?
py_script

การตั้งค่าเบรกพอยต์ขึ้นอยู่กับใบสมัครของคุณทั้งหมดและวิธีการจัดระเบียบ

2
ที่จริงแล้วมันค่อนข้างยากที่จะ "ตรวจสอบ" และดูว่าเว็บอินเทอร์เฟซถูกสร้างขึ้นที่ไหนและด้วยระบบเชิงวัตถุใหม่เช่น Backbone.js และแม่แบบซึ่งกำลังเป็นที่นิยมมากขึ้น
NoBugs

1
@jeffo เมื่อคุณทำเช่น File-> Open ในแอปพลิเคชั่น (สมมติว่า LibreOffice's Writer) คุณจะหาลำดับการโทรที่อยู่เบื้องหลังได้อย่างไร
py_script

คำตอบ:


21

การติดตามย้อนกลับ

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

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

ข้อเสียข้อดี

  • มันง่ายกว่าเสมอที่จะเดินขึ้นไปบนสแต็คการโทรและดูว่าคุณไปไหนมาไหนได้บ้าง
  • อาจมีหลายล้านเงื่อนไขที่ต้องเป็นจริงก่อนถึงจุดสิ้นสุด หากคุณทราบจุดสิ้นสุดแล้วคุณได้ช่วยตัวเองทำงานมากมาย
  • หากคุณสมบัติผิดปกติ คุณอาจไม่ถึงจุดสิ้นสุดและเวลาอาจเสียเวลาลองคิดดูว่าทำไม

การค้นหาปลายทาง

ในการดีบักคุณลักษณะที่คุณต้องรู้ว่าในซอร์สโค้ดนั้นบรรลุเป้าหมายขั้นสุดท้ายได้อย่างไร จากจุดนี้คุณสามารถย้อนกลับเพื่อดูว่าโค้ดมาถึงอย่างไร ตัวอย่าง; เพื่อให้เข้าใจถึงวิธีการเลิกทำการ คุณรู้ว่าสิ่งใดในโค้ดที่ยกเลิกได้ แต่คุณไม่รู้ว่าสิ่งต่าง ๆ อยู่ตรงไหน นี่จะเป็นตัวเลือกสำหรับการbacktracingเพื่อค้นหาว่าคุณลักษณะนี้ทำงานอย่างไร

ติดตามไปข้างหน้า

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

ข้อเสียข้อดี

  • เป็นจุดเริ่มต้นที่ง่ายที่สุดในการค้นหาสถานที่
  • ความซับซ้อนของรหัสจะลดประสิทธิภาพของการติดตามไปข้างหน้า ยิ่งมีรหัสมากเท่าไหร่โอกาสที่คุณจะไปในทิศทางที่ผิดก็จะยิ่งมากขึ้นเท่านั้น
  • การติดตามไปข้างหน้ามักส่งผลให้เกิดการตั้งค่าเบรกพอยต์ซึ่งจะถูกเรียกใช้โดยเหตุการณ์ที่ไม่เกี่ยวข้อง การขัดจังหวะกระบวนการตรวจแก้จุดบกพร่องและรบกวนการค้นหาของคุณ

เริ่มการค้นหาจุด

คุณสามารถใช้คำสำคัญตัวระบุส่วนต่อประสานผู้ใช้ (ID ปุ่มชื่อหน้าต่าง) หรือง่ายต่อการค้นหาผู้ฟังเหตุการณ์ที่เกี่ยวข้องกับคุณสมบัติ ตัวอย่างเช่นคุณอาจเริ่มต้นด้วยปุ่มที่ใช้เพื่อเรียกใช้คุณสมบัติการเลิกทำ

กระบวนการกำจัด

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

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

คุณต้องลดทิศทางของตำแหน่งโดยไม่ติดตามเส้นทางที่เห็นได้ชัดว่าจะไม่ถูกดำเนินการสำหรับคุณสมบัติ การย้ายที่ผ่านมาของรหัสนี้และเพียงวางจุดพักซึ่งมีความเกี่ยวข้องกับคุณลักษณะ

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

ข้อเสียข้อดี

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

ขอบคุณ Matthew วิธีการที่ยอดเยี่ยม แต่คุณจะหาจุดเริ่มต้นได้อย่างไร (ขออภัยถ้าเห็นได้ชัดสำหรับฉันทั้งหมด)?
py_script

@py_script ภาษาการเขียนโปรแกรมอะไรที่คุณมีปัญหา?
ซ้ำ

มันไม่เกี่ยวกับปัญหาเฉพาะที่ฉันมี แต่ภาษาการเขียนโปรแกรมบนเดสก์ท็อปหลักของฉันคือ Java ดังนั้นให้ไปกับมันด้วย
py_script

11

สมมติว่าคุณสมบัตินั้นเชื่อมโยงกับ UI บางอย่างเช่นปุ่มหรือเมนูสิ่งที่ฉันมักจะทำตาม (น่าเบื่อมาก แต่ก็ใช้งานได้) นี้จะมองผ่านรหัสแหล่งที่มาไม่ได้ใช้ดีบัก

  1. ค้นหาข้อความ (โดดเด่นอย่างหวังว่า) บนปุ่มเช่น "Super Feature X3"
  2. SUPER_BUTTON_3 = "Super Feature X3"ที่น่าจะเป็นในแฟ้มที่มีอย่างต่อเนื่องบางส่วนเช่น สำหรับการอ้างอิงในอนาคตให้จำชื่อไฟล์นี้
  3. อาจมีอีกเลเยอร์ (หรือแม้แต่สอง) ของสิ่งที่เป็นนามธรรมให้ค้นหาเพื่อรับสตริง "ของจริง" ที่ใช้โดยปุ่ม สังเกตว่าจะทำเช่นนี้ได้ในอนาคต
  4. ตอนนี้ค้นหาค่าคงที่ หวังว่าตอนนี้คุณจะพบปุ่มแล้ว อาจเป็นที่ที่พวกเขาเชื่อมต่อ ActionListener (ฉันกำลังใช้ภาษาจาวาที่นี่ YMMV แต่แนวคิดยังคงมีอยู่)
  5. หากจำเป็นให้ค้นหาปุ่มนั้นและในที่สุดคุณจะพบว่ามันเชื่อมต่อกับ Listener
  6. บางทีผู้ฟังนั้นเปลี่ยนเส้นทางไปยังผู้ฟังคนอื่น (ฟังก์ชั่น "ของจริง") ตามค่าคงที่ถ้าเป็นเช่นนั้น หมายเหตุ : หากมีสิ่ง dispatchy กลางนี้เป็นสถานที่ที่ดีในการติดตั้งจุดพัก
  7. สุดท้ายคุณควรอยู่ที่รหัสจริง

ตามที่ @ มอนสังเกตว่าบางครั้งตัวดีบักนั้นง่ายกว่า ...


หนึ่งที่น่าสนใจ ... โชคดีชื่อดังกล่าวมักจะ hardcoded ในรหัส :)
py_script

3
  • หากคุณสามารถค้นหารหัสที่เกี่ยวข้องได้คุณสามารถใช้ซอฟต์แวร์ควบคุมแหล่งข้อมูลเพื่อแสดงการกระทำทั้งหมดหรือการกระทำที่อยู่ใกล้เคียงซึ่งเพิ่มเข้าไป ที่ควรแสดงให้คุณเห็นทุกอย่างที่จำเป็นในการใช้คุณลักษณะนั้น

  • วิธีง่าย ๆ ในการค้นหาจุดเริ่มต้นในการค้นหาคือการ grep ผ่าน codebase ของคุณเพื่อค้นหาข้อความบนปุ่ม

  • บ่อยครั้งที่คนจะใส่รหัสปัญหาจากตัวติดตามปัญหาของพวกเขาในข้อความกระทำของพวกเขา หากคุณสามารถค้นหาปัญหาที่อธิบายคำขอคุณลักษณะได้คุณสามารถค้นหาการกระทำด้วยรหัสปัญหานั้น


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