ฉันสามารถปิดการปรับให้เหมาะสมได้หรือไม่ดังนั้นตัวแปรในขอบเขตจากการปิดจะไม่“ ปรับให้เหมาะสม”


11

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

ตอนนี้คำถามของฉันคือมีวิธีที่จะปิดพฤติกรรมนี้หรือไม่ ฉันสามารถแก้ไขไฟล์กำหนดค่าบางอย่างหรือมีปลั๊กอินของเบราว์เซอร์หรืออาจจะมี "รุ่นต่อสร้างพิเศษสำหรับนักพัฒนา" ของเบราว์เซอร์ที่สามารถใช้งานได้? ฉันชอบที่จะพิมพ์รหัสของฉันลงในคอนโซลทันทีที่ฉันเขียนรหัสใหม่ดังนั้นนี่เป็นการบักฉันจริงๆ

visualSummaryIffalseConsoleLog

อัปเดต / แก้ไข

นี่คือทางออกบางส่วนให้เครดิตกับ Paul1365972

คุณต้องเริ่มเบราว์เซอร์ chrome จากบรรทัดคำสั่งด้วยตัวเลือกพิเศษเช่น:

  1. ปิด Chrome อย่างสมบูรณ์
  2. เรียกใช้ Chrome จากคอนโซลด้วย"C:/Program Files (x86)/Google/Chrome/Application/chrome.exe" --js-flags="--allow-natives-syntax" สำหรับ Windows ระบบปฏิบัติการอื่นที่คล้ายคลึงกัน
  3. "%GetHeapUsage()"เปิดคอนโซลนักพัฒนาและดำเนินการ หากคุณเริ่มต้น Chrome อย่างถูกต้องด้วยตัวเลือกตัวเลขจะถูกบันทึกไว้ในคอนโซลมิฉะนั้นคุณจะได้รับข้อผิดพลาดทางไวยากรณ์

ด้วยการตั้งค่าสถานะบรรทัดคำสั่งนี้คุณสามารถ 'คุยกับเครื่องยนต์ V8' ด้วยคำสั่งที่ขึ้นต้นด้วย%ซึ่งเป็นข้อผิดพลาดทางไวยากรณ์ใน JavaScript ธรรมดา รายการคำสั่ง V8 พร้อมใช้งานชนิดนี้ถูกกำหนดในคำตอบของพอล

มีอยู่%NeverOptimizeFunction()ในรายการนั่นซึ่งเป็นสิ่งที่ดูเหมือนว่าฉันจะต้องโทรและทำได้ น่าเสียดายที่ฟังก์ชั่นนั้นไม่ได้ทำตามที่ฉันหวังไว้ดังที่แสดงในสกรีนช็อตถัดไป

lorem ยังไม่ได้กำหนด

((( ลิงก์อื่นจากคำตอบของ Paul (โมดูลโหนด v8-natives)) ไม่มีความสำคัญกับเราที่นี่ในบริบทนี้สิ่งที่มันทำคือมันล้อมรอบหนึ่ง-liners รอบการเรียกฟังก์ชัน "%" เพื่อให้รหัสไม่ผิดพลาด เบราว์เซอร์ที่ไม่ใช่ v8)))

(((จำได้ว่าเป็นช่วงเวลาที่ใช้งานได้ดี (เมื่อการเพิ่มประสิทธิภาพนี้ยังไม่ได้คิดค้น / นำไปใช้) ฉันไม่รู้ว่านานมาแล้วสิบปี 15 ปีอะไรอย่างนั้น Chrome รุ่นสุดท้ายคืออะไร (ถ้า ใด ๆ ) และรุ่น firefox ล่าสุดคืออะไร (แน่นอนว่ามีอยู่) ที่คุณสามารถทำได้มันจะไม่ทำให้คุณได้รับความโปรดปราน แต่มันจะทำให้คุณได้คะแนนสูงถ้าคุณรู้และโพสต์มันเป็นคำตอบ .)))

การแก้ไขปัญหา

ขอบคุณ PETR SRNICEK

แก้ไขแฮ็ก

คำถามใหม่

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


ผลที่ไม่ตั้งใจบทที่สิบและหนึ่งในนั้น การเพิ่มประสิทธิภาพนี้มีผลกระทบเชิงลบต่อรูปแบบการเข้ารหัสของฉัน ฉันพบว่าตัวเองใช้ old fashioned for loop (แทนที่จะเป็น. map, .forEach, .reduce) มากกว่าที่ฉันจะทำดังนั้นฉันจึงหลีกเลี่ยงปัญหานี้
mathheadinclouds

v8-nativesห้องสมุดเพียง wraps ที่สำคัญ% โทรในรหัสในห้องสมุดง่ายๆที่ควรจะเป็นnoopsในเบราว์เซอร์หรือโหนดซึ่งไม่ได้เริ่มต้นในพิเศษธง --allow-พื้นเมืองไวยากรณ์ ..
นาธานาเอ

ฉันรันการทดสอบบางอย่างฟังก์ชัน 'bodyOnLoad' ไม่ได้รับการปรับปรุงให้ดีที่สุด ดังนั้นการใช้คำสั่ง internals เพื่อพยายามบังคับให้ de-optimization ไม่ทำอะไรเลย
นาธานาเอล

@ นาธานาเอล: การโทรที่สำคัญคือ%NeverOptimizeFunction(foo)ฉันเพิ่งจะเรียกมันว่าเพื่อร่างกายโหลด "เพียงเพราะ" การคิด "ดีมันจะไม่เจ็บ" ปัญหาคือfooไม่ได้เพิ่มประสิทธิภาพในแบบที่ฉันหวังไว้ ตัวแปรloremมองไม่เห็น สมมติว่าฉันต้องการเขียนโค้ดบางอย่างที่จะเข้าไปในฟังก์ชั่น foo แทนที่จะพิมพ์ลงในโปรแกรมแก้ไขข้อความของฉันฉันพิมพ์ลงในคอนโซล dev (ในขณะที่ดีบักเกอร์นั่งอยู่ที่ foo) ดูว่ามันเป็นสิ่งที่ฉันต้องการหรือไม่แล้วคัดลอก / วางจากคอนโซลไปยังโปรแกรมแก้ไขข้อความของฉัน นั่นคือวิธีที่ฉันชอบทำงาน และไม่สามารถ เพราะการปรับให้เหมาะสม รับมัน
mathheadinclouds

1
ฉันใช้เวลาหลาย ๆ การทดลองของเรากับหลาย ๆ อย่าง--js-flags(รวมถึงหลาย ๆอันที่เกี่ยวข้องกับTurboFan ) เช่นเดียวกับคำสั่ง V8 หลายภาษาก่อนที่ Paul1365972 โพสต์คำตอบของเขา แต่ฉันไม่สามารถบรรลุพฤติกรรมที่ต้องการได้ ฉันเชื่อว่าวิธีนี้อาจเป็นจุดจบ การเพิ่ม[v8]แท็กให้กับคำถามนี้อาจคุ้มค่า บางคนที่มีความเข้าใจอย่างลึกซึ้งเกี่ยวกับการทำงานภายในของ V8 อาจสามารถชี้แจงได้ว่านี่เป็นวิธีที่จะไปหรืออาจชี้คุณไปในทิศทางที่ถูกต้อง
Petr Srníček

คำตอบ:


2

คุณสามารถได้รับการเข้าถึงตัวแปรทั้งหมดโดยการตัดงบการดีบักใน EVAL eval("debugger;");เช่นนี้: โซลูชันแฮ็คนี้จะเพิ่มฟังก์ชั่นที่ไม่ระบุตัวตนอื่น ๆ ให้กับ call stack แม้ว่าจะเห็นได้ชัดว่าไม่มีประโยชน์สำหรับจุดพักที่ตั้งค่าด้วยตนเองใน DevTools

สิ่งนี้ดูเหมือนจะไม่เป็นทางออกที่ดีมาก แต่เนื่องจากเป็นเพียงสิ่งเดียวที่ประสบความสำเร็จตามที่คาดหวังไว้ฉันจึงโพสต์มันเป็นคำตอบ


มันช่างน่าประหลาดใจสำหรับฉันที่ใช้งานได้ คุณรู้ไหมฉันลองพิมพ์ eval ("lorem") และนั่นทำให้เกิดข้อผิดพลาด "lorem ไม่ได้ถูกกำหนด" สำหรับฉันแล้วมันไม่สมเหตุสมผลเลยที่การพิมพ์ eval ("lorem") บนคอนโซล (ในขณะที่อยู่ในคำสั่ง debugger ในฟังก์ชั่น foo) ควรทำอะไรที่แตกต่างจากสิ่งที่ eval ("debugger") กำลังทำอยู่ - คาดหวังพิมพ์ "ipsum" ไปยังคอนโซล แต่พวกเขาแตกต่างกันมาก แปลก.
mathheadinclouds

นั่นเป็นงานที่น่าสนใจ เป็นการแฮ็กเล็กน้อยเนื่องจากคุณไม่สามารถก้าวออกจากคำสั่ง debugger ได้ (คุณต้องสลับไปที่ไฟล์ต้นฉบับด้วยตนเอง) มิฉะนั้นคุณจะสูญเสียทั้ง stack และกลับไปที่ฟังก์ชั่นที่เรียกว่า eval ปล่อยให้คุณกองซ้อนที่ลดลงหายไปบริบทอื่น ๆ
นาธานาเอล

เราสามารถแก้ไขกลอุบายนี้ได้: แทนที่จะใช้ eval ("debugger"), ใส่ just eval ("") - แต่ส่วนมากจะกระจายไปทั่วรหัสทุกที่ที่คุณคิดว่าคุณอาจต้องการ 'จุดพักขยาย' จากนั้นคุณสามารถตั้งค่าเบรกพอยต์ (ด้วยเครื่องมือ dev) ที่หนึ่งในคำสั่ง eval ('') คือและเมื่อคุณหยุดที่นั่นคุณจะ "ก้าวเข้าสู่" ฉันกำลังพิจารณาที่จะเขียน transpiler เล็กน้อย (คำใหญ่สำหรับสิ่งเล็ก ๆ น้อย ๆ ที่ฉันกำลังทำ) วางข้อความเหล่านั้นไว้ที่จุดเริ่มต้นของแต่ละฟังก์ชัน stackoverflow.com/questions/59159996/…
mathheadinclouds

ฉันพยายามแทนที่ eval ("debugger") โดย eval (); ดีบักเกอร์และได้ผลลัพธ์ที่แตกต่างกันขึ้นอยู่กับการใช้งานของ Firefox หรือโครเมี่ยม i.stack.imgur.com/wy5WT.png
mathheadinclouds

3

Google Chrome ใช้ V8 JS-Engine คุณสามารถเปิดใช้การโทรแบบเนทีฟด้วยแฟล็ก --allow-natives-syntax ซึ่งจะทำให้ฟังก์ชั่นการดีบักที่มีประโยชน์มากมาย (รายการทั้งหมดที่นี่ ) เช่นเดียวกับที่คุณต้องการ:% NeverOptimizeFunction () . หากไม่มีแฟล็กนี้การเรียกเหล่านี้จะเป็นไวยากรณ์ที่ผิดกฎหมายดังนั้นควรระมัดระวังเมื่อปรับใช้ (หรือใช้ไลบรารีv8-Natives )

หากต้องการเปิดใช้งานคุณลักษณะนี้เพียงเปิด chrome ด้วย --js-flag = "- allow-natives-syntax" (ใช้สำหรับการดีบักเว็บไซต์ที่เชื่อถือได้เท่านั้นเนื่องจากสามารถให้การเข้าถึงโค้ด js ที่ไม่น่าเชื่อถือกับสิ่งที่คุณไม่ต้องการ สามารถเข้าถึง)


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

tl; dr use --js-flag = "- allow-natives-syntax" แทน ในการเปิดใช้งานคุณสมบัติ V8 JS-Engine จำเป็นต้องเริ่มด้วยแฟล็ก --allow-natives-syntax อย่างไรก็ตามคุณไม่สามารถเริ่มได้โดยตรงนี่เป็นงาน Chromes ดังนั้นคุณต้องบอกให้โครเมี่ยมเริ่มสตาร์ทเครื่องยนต์ด้วยธงคุณจะทำอย่างไร เพียงแค่ผ่านธงเครื่องยนต์ที่กล่าวถึงผ่าน --js-flag = <ธงของคุณที่นี่> เพื่อโครเมี่ยม
Paul1365972

Nope เพิ่งลองอีกครั้งเพื่อเป็นหนึ่งในด้านที่ปลอดภัย ฉันได้ลองทั้งสอง--allow-natives-syntaxและ--js-flags="--allow-natives-syntax"หลายครั้งในฐานะ "สิ่งที่ฉันพิมพ์หลังจาก 'chrome' ในคอนโซลระบบปฏิบัติการ" ถ้าฉันไม่ได้ลองด้วยตัวเองทั้งหมดนี้ฉันก็คิดว่าการพิมพ์ผิดเป็นคำอธิบายที่เป็นไปได้มากที่สุด ฉันทำภาพหน้าจออื่น i.stack.imgur.com/7cpPP.pngดูตัวพิมพ์ผิด? โปรดให้คำตอบที่ตรงไปตรงมา: คุณเพียงแค่ "อ่านและทำความเข้าใจกับบทความ" (เพื่อความชัดเจนไม่มีอะไรผิดปกติกับสิ่งนั้นหากคุณไม่ได้อ้างสิทธิ์เพิ่มเติม) หรือคุณได้ลองทุกอย่างในเครื่องของคุณหรือไม่? ขอบคุณ
mathheadinclouds

แค่เดาว่าเป็นไปได้ไหมว่าฉันจะไม่เริ่มการทำงานของ chromeด้วยตัวเลือกนั้น แต่ฉันจะรวบรวมแหล่ง C ++ (หรืออะไรก็ตาม) chromeด้วยตัวเลือกนั้นหรือไม่?
mathheadinclouds

1
แปลกที่ฉันเพิ่งทดสอบและทำงานได้ดีไม่จำเป็นต้องรวบรวม ฉันจะเขียนสิ่งที่ฉันทำอย่างแน่นอนดังนั้นจึงไม่มีความเข้าใจผิด 1. ปิด Chrome อย่างสมบูรณ์ 2. เรียกใช้ Chrome จากคอนโซลด้วย "C: / ไฟล์โปรแกรม (x86) /Google/Chrome/Application/chrome.exe" --js-flag = "- allow-natives-syntax" 3. เปิด คอนโซลผู้พัฒนาและดำเนินการ "% GetHeapUsage ()" เพื่อทดสอบว่าทุกอย่างใช้งานได้หรือไม่
Paul1365972

0

ฉันหวังว่าคำถามนี้จะมีคำตอบที่แท้จริง สิ่งต่อไปนี้ไม่ใช่คำตอบที่แท้จริงมันเป็นการชั่วคราว ฉันเขียนเครื่องมือช่วยเหลือที่คุณสามารถสร้างรหัสตัวช่วยโง่ของแบบฟอร์มif (false) { console.log(variables, from, closures); }(ดูภาพหน้าจอที่มีปัญหา) โดยใช้การวิเคราะห์แบบคงที่ - คุณวางในรหัสของคุณคำสั่งโง่ถูกสร้างขึ้นคุณสามารถคัดลอกแล้วคุณไม่ต้องการ เพื่อพิมพ์ ฉันไม่รู้ว่าจะช่วยได้มากเพราะการคัดลอกและการวางทั้งหมดต้องใช้เวลา แต่นั่นคือสิ่งที่ฉันได้รับ

ภาพหน้าจอ

ซอ

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