ฉันจะเข้าใกล้การแก้ไขข้อผิดพลาดที่ไม่สามารถผลิตได้ / สุ่มเกิดขึ้นได้อย่างไร?


11

เรามีเว็บไซต์หลายภาษาที่มีการค้นพบข้อบกพร่องเมื่อหลายวันก่อน มันแสดงข้อมูลภาษาอื่น ๆ ในภาษาอื่นและเลือกข้อมูลผสมเช่นภาษาอังกฤษ แต่มันก็แสดงข้อมูลภาษาอื่นเช่นกันในหน้าและในทางกลับกัน มันทำไม่บ่อยนัก แต่มีอยู่ในเว็บไซต์ การดูรหัสยังไม่ช่วยเพราะสิ่งนี้ไม่ได้เกิดขึ้นเสมอไป

ข้อเสนอแนะใด ๆ ในการค้นหาปัญหาในเวลาที่เหมาะสม? ฉันขอกลยุทธ์ที่นี่


4
เริ่มต้นการตรวจสอบโค้ดสำหรับสถานการณ์ที่จะทำให้ข้อผิดพลาดนี้เกิดขึ้น (แทนที่จะทำอย่างอื่น)
Imran Omar Bukhsh

คำตอบ:


20

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

  • ภาษาตรวจพบได้อย่างไร? เป็นไปตามข้อมูลจากคำขอ HTTP หรือไม่ มันขึ้นอยู่กับข้อมูลเซสชั่นหรือไม่หรือมันขึ้นอยู่กับเขตข้อมูลฐานข้อมูล? โดยพื้นฐานแล้วนี่เป็นปัญหาที่เกี่ยวข้องกับวิธีที่แอพคุณเลือกภาษาสำหรับแต่ละส่วนหรือไม่?
  • ภาษาแสดงอย่างไร คุณกำลังดึงจากไฟล์คุณสมบัติหรือฐานข้อมูลหรือไม่? เป็นไปได้หรือไม่ว่าการอ้างอิงไปยังภาษาที่ถูกต้องนั้นกำลังสูญหายอยู่บ้าง? ภาษาที่คุณเห็นเป็นค่าเริ่มต้นสำหรับเว็บไซต์หรือไม่
  • มีความสัมพันธ์กับสภาพแวดล้อมของลูกค้าหรือไม่? สิ่งนี้เกี่ยวข้องกับสัญลักษณ์แสดงหัวข้อแรก แต่เพิ่มอีกเล็กน้อย ฉันมีปัญหาการแสดงผลที่แปลกเนื่องจากพร็อกซีแคชแบบดาวน์สตรีม โดยทั่วไปแล้วปัญหาประเภทดังกล่าวเป็นทั้งเพจที่ค้างหรือแสดงหน้าของบุคคลหนึ่งให้กับผู้ใช้รายอื่น (ที่น่าอับอาย)
  • คุณกำลังใช้ค่า Thread Local หรือไม่? หากคำขอได้รับการจัดการมากกว่าหนึ่งเธรดค่าเธรดโลคัลจะมีข้อมูลที่แตกต่างกันตามเธรดที่ทำงานอยู่ในขณะนั้น ในสภาพแวดล้อมของเว็บเซิร์ฟเวอร์คุณไม่สามารถสันนิษฐานได้ว่าเธรดที่คุณเริ่มการประมวลผลจะเป็นเธรดเดียวกับที่คุณดำเนินการจนเสร็จสมบูรณ์ - ยกเว้นว่าเป็นส่วนหนึ่งของข้อมูลจำเพาะสำหรับแพลตฟอร์มของคุณ ผู้เขียนเซิร์ฟเวอร์พบว่าหากพวกเขานำกลุ่มเธรดขนาดเล็กและมัลติเพล็กซ์มาใช้ซ้ำในกลุ่มพวกเขาสามารถจัดการคำร้องขอเพิ่มเติมพร้อมกันได้ แม้ว่าคุณจะมีหนึ่งเธรดตั้งแต่เริ่มต้นจนเสร็จสิ้นการร้องขอเซิร์ฟเวอร์อาจทวีคูณการร้องขออื่น ๆ ไปยังเธรดนั้นในเวลาเดียวกัน แทนที่จะเป็นเธรดโลคัลให้พิจารณาโยงค่านั้นกับแอ็ตทริบิวต์คำร้องขอหรือเซสชัน

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

  • ใช้การบันทึกที่มากมายรอบ ๆ พื้นที่ปัญหา นี่คือสถานที่ซึ่งเครื่องมืออย่าง Log4J หรือ Log4Net สามารถเปล่งประกายได้อย่างแท้จริง เฟรมเวิร์กการบันทึกข้อมูลนั้นและอื่น ๆ เช่นนั้นอนุญาตให้คุณเปิดใช้งานการบันทึกสำหรับบางหมวดหมู่ในขณะที่ลดเสียงรบกวนสำหรับทุกอย่างอื่น - ทั้งหมดโดยการเปลี่ยนไฟล์การกำหนดค่า คุณต้องการที่จะแนะนำงบการบันทึกใหม่เพื่อหาว่าสิ่งที่คุณสงสัยอาจเป็นปัญหาได้หรือไม่ ตรวจสอบให้แน่ใจด้วยว่าบันทึกการเข้าถึง HTTP ของคุณมีข้อมูลทั้งหมดที่คุณต้องการเกี่ยวกับคำขอแต่ละรายการ (คุกกี้พารามิเตอร์ส่วนหัว http ฯลฯ )
  • พยายามจำลองปัญหา เนื่องจากสิ่งนี้เกิดขึ้นเป็นระยะ ๆ โหลดเช่นบนเซิร์ฟเวอร์ ณ เวลาที่มันเกิดขึ้นคืออะไร? คุณได้รับการตอบรับจำนวนมากพร้อมกันจากหลายภาษาหรือไม่? ถ้าเป็นเช่นนั้นพยายามจำลองโหลดชนิดนั้นในสภาพแวดล้อมการทดสอบของคุณ เครื่องมือที่คล้ายกับ JMeter อาจเป็นสิ่งที่คุณต้องการ คุณจะต้องสามารถปลอมแปลงที่อยู่ IP สำหรับลูกค้าปลอมของคุณได้ โปรดจำไว้ว่าที่อยู่ IP นั้นได้รับการจัดสรรเพื่อให้คุณสามารถทราบได้ว่าประเทศ / ภูมิภาคใดที่ IP อิงตามสองส่วนแรกของที่อยู่
  • ปัญหาดังกล่าวจะเกิดขึ้นเป็นระยะ ๆ ในสภาพแวดล้อมการทดสอบของคุณ แต่ในขณะที่คุณแคบลงในสาเหตุที่แท้จริงของคุณคุณสามารถบิดเบือนผลลัพธ์เพื่อให้มันเกิดขึ้นบ่อยกว่าที่อยู่ในป่า นอกจากนี้คุณสามารถตรวจสอบไฟล์บันทึกได้ง่ายขึ้นและพยายามเรียนรู้จากพวกเขา
  • มันเป็นกระบวนการที่ต้องทำซ้ำดังนั้นจงอดทน คุณต้องชักนำให้เกิดประเภทของการโหลดที่คุณคิดว่าจะทำซ้ำข้อผิดพลาดตรวจสอบบันทึกและปรับแต่งการทดสอบของคุณตามสิ่งที่คุณค้นหา สิ่งสำคัญคือการระบุปัญหาดังนั้นต้านทานการกระตุ้นให้ทำการแก้ไขง่าย ๆ ที่อาจทำให้ปัญหาจริงเกิดขึ้นน้อยลงเท่านั้น

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

ตอนนี้คุณสามารถแก้ไขได้และมั่นใจอย่างมีเหตุผลว่าจะไม่กลับมากัดคุณอีก


10

ข้อผิดพลาดไม่สามารถแก้ไขได้ คุณยังไม่ได้ค้นพบวิธีการทำซ้ำ

ไม่มีข้อผิดพลาดแบบสุ่มเว้นแต่คุณจะโยนข้อยกเว้นขึ้นอยู่กับค่าตอบแทนของคำสั่งสุ่ม () บางอย่าง

ฉันรู้ว่าสิ่งนี้อาจดูเหมือนความหมาย แต่ก็มั่นใจด้วยใจที่จะบอกสิ่งนี้กับตัวเอง

มันยากมากและน่าหงุดหงิดที่จะค้นหาวิธีที่จะแก้ไขข้อผิดพลาดที่เกิดขึ้นเนื่องจากสภาพการแข่งขันที่ซับซ้อนหรือ

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

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

หวังว่าคุณจะสามารถหาโอกาสในการขายได้


แม้การโทรแบบสุ่ม () จะไม่สุ่มอย่างแท้จริงเว้นแต่จะได้มาจากตัวกำเนิดสัญญาณรบกวนสีขาวของฮาร์ดแวร์ พวกมันคือ psuedo-random ซึ่งหมายถึงตัวเลขนั้นถูกกระจายทางคณิตศาสตร์ในรูปแบบสุ่มตามลำดับที่เป็นไปได้ แต่ถ้าคุณเริ่มจากค่า "เมล็ด" ที่เหมือนกันคุณจะได้รับคำตอบเหมือนกันทุกครั้ง
Berin Loritsch

1
@Berin: ฉันรู้
Gilles

+1 สำหรับ "คุณยังไม่พบวิธีการทำซ้ำ" ข้อบกพร่องทั้งหมดมีสาเหตุที่มิฉะนั้นพวกเขาจะไม่เกิดขึ้น
Mike S

1
ไม่จำเป็นต้องเป็นการสุ่ม () สิ่งต่าง ๆ ซึ่งขึ้นอยู่กับเวลาโดยเฉพาะอย่างยิ่งสิ่งที่เกี่ยวข้องกับการเข้าถึงทรัพยากรที่ใช้ร่วมกันอย่างไม่เหมาะสมนั้นยากที่จะทำซ้ำ
Loren Pechtel

2
@Gilles: ยกเว้นพวกเขาอาจไม่สามารถกำหนดสิ่งที่คุณสามารถวัดได้อย่างสมเหตุสมผล (พูดอย่างแน่นอนเมื่อมีงานอื่นที่ปล่อยออกมามันเป็นช่วงเวลา)
Loren Pechtel

5

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

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


2

ระบบอัตโนมัติน่าจะช่วยได้หากเป็นขั้นตอนเดียวกันในการทำซ้ำซึ่งบางครั้งล้มเหลวให้ทำโดยอัตโนมัติและวางไว้ในลูป ทำงานใน 50,000 ครั้งและมีโอกาสเกิดขึ้นได้มาก


เหตุการณ์ไม่ได้สุ่มดูเหมือนว่าจะสุ่ม การทำเช่นนี้อาจทำให้มันปรากฏ แต่จะให้ข้อมูลน้อยมากเกี่ยวกับสาเหตุที่ปรากฏ
Josh K

1
@Josh - หากเขาไม่สามารถทำซ้ำได้นี่อาจเป็นวิธีที่ดีในการทำเช่นนั้นและได้รับการติดตามสแต็กที่มีสัญลักษณ์ดีบักตัวอย่างเช่น ฉันคิดว่ามันเป็นก้าวแรกที่ยอดเยี่ยม - การได้เห็นมันเป็นมือแรก
Kieren Johnstone

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

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

ฉันไม่เห็นด้วยและฉันเชื่อว่าคำตอบของ Berinเป็นวิธีที่ถูกต้องในการแก้ไขปัญหานี้
Josh K

1

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


ไม่มีอึ ..............
theringostarrs

0

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

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

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

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