“ ไม่สามารถประเมินนิพจน์ได้เนื่องจากรหัสของวิธีการปัจจุบันนั้นได้รับการปรับให้เหมาะสมที่สุด” ใน Visual Studio 2010


153

ฉันใช้ Visual Studio 2010 ในโหมดแก้ไขข้อบกพร่องและฉันไม่ได้ทำเครื่องหมาย "รหัสการเพิ่มประสิทธิภาพ" ฉันไม่สามารถดู (หรือโฮเวอร์บน) ตัวแปรใด ๆ ในตัวดีบักได้อย่างรวดเร็ว ฉันได้รับข้อผิดพลาดนี้ "ไม่สามารถประเมินนิพจน์ได้เนื่องจากรหัสของวิธีการปัจจุบันได้รับการปรับให้เหมาะสม"

แม้แต่บรรทัดอย่างเช่น: int i = -3, ทำการเฝ้าดูอย่างรวดเร็วบน i, ฉันได้รับ "ไม่สามารถรับค่าของโลคัลหรืออาร์กิวเมนต์ 'i' เนื่องจากไม่สามารถใช้งานได้ที่ตัวชี้คำสั่งนี้อาจเป็นเพราะมันถูกปรับให้เหมาะสม

ลิงค์นี้อ้างอิงในคำถามที่คล้ายกันดูเหมือนจะไม่ใช้

มีการตั้งค่าที่ฉันขาดหายไปหรือไม่?


4
torulflundgren.blogspot.com.au/2010/03/…นี่เป็นทางออกที่ดีที่สุดที่ฉันพบ ฉันทดสอบสิ่งนี้ใน visual studio 2013 และทำงาน ....
Dulanjana Wickramatantri

คำตอบ:


167

ขณะที่โปรเจ็กต์อยู่ในโหมดดีบักโซลูชันไม่ เมื่อฉันเปลี่ยนมันใช้งานได้


9
ฉันมีปัญหานี้ใน VS2012 แต่การแก้ปัญหาและโครงการทั้งหมดถูกตั้งค่าเป็น Debug โดยไม่มีการเพิ่มประสิทธิภาพ ฉันทำความสะอาดโซลูชัน / สร้างใหม่แก้ไขให้ฉัน
saarp

20
ดังนั้น ... คุณจะตั้งค่าโซลูชันเป็นโหมดที่ไม่ใช่การดีบักได้อย่างไร?
user1431072

user1431072 - คุณคลิกขวาที่โซลูชันหรือโครงการของคุณแล้วเลือกคุณสมบัติจากนั้นคุณสามารถตั้งค่าให้เป็นโหมดแก้ไขข้อบกพร่อง
Yevgraf Andreyevich Zhivago

48

ฉันมีปัญหานี้เมื่อฉันใช้ VS 2010 การกำหนดค่าโซลูชันของฉันเลือก (ดีบั๊ก) ฉันแก้ไขปัญหานี้ได้โดยยกเลิกการเลือกคุณสมบัติเพิ่มประสิทธิภาพของรหัสภายใต้คุณสมบัติของโครงการ โครงการ (คลิกขวา) => คุณสมบัติ => สร้าง (แท็บ) => ยกเลิกการเลือกปรับรหัสให้เหมาะสม


29

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

  • ทำการสร้างไฟล์โซลูชันของคุณใหม่เสร็จสมบูรณ์ (คลิกขวาที่โซลูชันและเลือกสร้างใหม่ทั้งหมด)
  • ขณะที่การดีบั๊กเปิดหน้าต่างโมดูล (Debug -> Windows -> Modules) และค้นหาชุดประกอบของคุณในรายการโมดูลที่โหลด ตรวจสอบว่าเส้นทางที่แสดงรายการกับแอสเซมบลีที่โหลดของคุณเป็นสิ่งที่คุณคาดหวังว่าจะเป็นและการประทับเวลาที่แก้ไขของไฟล์บ่งชี้ว่าแอสเซมบลีนั้นถูกสร้างใหม่จริง ๆ
  • หน้าต่างโมดูลควรบอกคุณด้วยว่าโมดูลที่โหลดนั้นได้รับการออปติไมซ์หรือไม่ - ตรวจสอบให้แน่ใจว่าหน้าต่างโมดูลนั้นระบุว่าไม่ได้รับการปรับให้เหมาะสม

หากคุณไม่เห็นรายการเมนูโมดูลในเมนูดีบั๊ก -> Windows คุณอาจต้องเพิ่มมันในเมนู "ปรับแต่ง ... "


2
โซลูชันถูกสร้างใหม่ หน้าต่างโมดูลแสดงว่าชุดประกอบได้รับการปรับให้เหมาะสมที่สุด ฉันไม่ได้ทำเครื่องหมายในช่องทำเครื่องหมายปรับให้เหมาะสมจึงไม่ทราบว่าทำไมชุดประกอบจึงปรับให้เหมาะสมเสมอ โซลูชันมีโครงการเว็บ แต่รหัสที่ฉันดูอยู่ในโครงการห้องสมุดคลาสในโหมดดีบัก
Tony_Henrich

@Tony - คำถามงี่เง่า แต่ไลบรารีคลาสมีช่องทำเครื่องหมาย "ปรับให้เหมาะสม" ยกเลิกการเลือกหรือไม่
Justin

ใช่. ฉันพูดถึงข้อเท็จจริงนี้ในคำถามของฉัน ฉันตอบคำถามของฉันไปแล้ว
Tony_Henrich

1
ฉันProject.Webมีการเพิ่มประสิทธิภาพuntickedแต่มันยังคงแสดงให้เห็นว่าเป็น Optimized เมื่อฉันมองไปที่การชุมนุมในDebug > Modules:(
J86

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

14

ใน VS2013 ไปที่: เครื่องมือ -> ตัวเลือก -> การดีบัก -> ทั่วไปและเปิดใช้งาน 'ใช้โหมดความเข้ากันได้ที่มีการจัดการ' สิ่งนี้ปิดใช้งานพฤติกรรมการประเมินฟังก์ชั่นใหม่


ขอบคุณ! จากการแก้ปัญหาอื่น ๆ ที่นำเสนอนี่คือสิ่งที่สำคัญสำหรับฉัน เกิดอะไรขึ้นที่แปลกประหลาดขึ้นมาทันทีฉันสงสัยว่าอะไรทำให้เกิดการเปลี่ยนแปลง
squid808

10

ลองรันในโหมด debug หากคุณกำลังทำงานในโหมด release คุณจะได้รับข้อความนี้


5
คำถามบอกว่า "ฉันใช้ Visual Studio 2010 ในโหมดดีบักและธรรมดา" ฉันใช้รหัสการเพิ่มประสิทธิภาพ "ไม่ได้เลือก" ... คุณควรลบคำตอบนี้
Jim Balter

อย่างจริงจัง. เขาบอกว่ามันเป็นคำถามที่ว่าเขากำลังทำงานอยู่ในการแก้ปัญหา ฉันไม่เข้าใจว่าทำไม upvotes คำตอบนี้ก่อให้เกิดมลพิษต่อการตัดสินใจที่เป็นไปได้
John Demetriou

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

เขาอาจมีมากกว่าหนึ่งแอสเซมบลีและในตัวจัดการการกำหนดค่าแอสเซมบลีที่เขากำลังตรวจแก้จุดบกพร่องผ่านสามารถตั้งค่าเป็นรุ่นหรือ sth
madoxdev

8

สถานการณ์ของฉันไม่ครอบคลุมโดยคำตอบข้างต้นใด ๆ ฉันพบสิ่งต่อไปนี้: บทความ MSDNในเธรดที่อธิบายว่าเมื่อติดอยู่ในการดำเนินการเธรดดั้งเดิมดั้งเดิม debugger ไม่สามารถเข้าถึงข้อมูล ตัวอย่างเช่นเมื่อเธรดกำลังนั่งอยู่บน Task.Wait () สิ่งนี้จะเกิดขึ้น


8

ผมมีปัญหาเหมือนกัน. แต่ในกรณีของฉันDebuggableแอตทริบิวต์ถูกเข้ารหัสอย่างหนักในAssemblyInfo.csไฟล์โครงการของฉันและดังนั้นจึงไม่ได้ (เกิน -) เขียนโดยการรวบรวม มันทำงานได้หลังจากลบบรรทัดที่ระบุDebuggableแอ็ตทริบิวต์


8

สำหรับฉันมันเกิดขึ้นใน VS2017 และ VS2019 มันหยุดเกิดขึ้นหลังจากฉันเลือกตัวเลือก "ระงับการเพิ่มประสิทธิภาพ JIT ในการโหลดโมดูล"

ป้อนคำอธิบายรูปภาพที่นี่


+1 นี่คือสาเหตุของปัญหาของฉัน VS ดูเหมือนจะไม่ค่อยเข้าใจตัวเลือก csproj มากเกินไปเนื่องจากฉันปิดการปรับให้เหมาะสมใน XML เมื่อการกำหนดค่าลงท้ายด้วย "Debug" มันทำงานได้ดีเมื่อโทร MSBuild โดยตรง แต่ไม่ถูกต้องใน VS เอง
TheBeardedQuack


4

นอกเหนือจาก @Kragen ที่กล่าวถึงหากคุณกำลังดีบักโครงการเว็บ

ปิด visual Studio และลองลบไฟล์ชั่วคราวที่ C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ไฟล์ ASP.NET


การแก้ปัญหามีโครงการเว็บ แต่รหัสอยู่ในโครงการห้องสมุดระดับ ฉันลบไฟล์ชั่วคราวหลายครั้ง
Tony_Henrich

4

อีกสิ่งหนึ่งที่คุณอาจทำคือสร้างไฟล์ที่มีชื่อเดียวกับ dll ที่ปรับให้เหมาะสม แต่มีส่วนขยาย ini และเพิ่มสิ่งต่อไปนี้:

[.NET Framework การควบคุมการดีบัก]
GenerateTrackingInfo = 1
AllowOptimize = 0

สิ่งนี้จะบอก JIT ไม่ให้ปรับตัวแปรของคุณให้เหมาะสม

โปรดทราบว่าคุณยังคงต้องการ pdb ดังนั้นคุณจะพบกับสิ่งนี้: yourDll.dll yourDll.pdb yourDll.ini

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

http://www.hanselman.com/blog/DebugVsReleaseTheBestOfBothWorlds.aspx


4

เมื่อคุณเห็นข้อความ " ไม่สามารถประเมินนิพจน์ได้เนื่องจากข้อความของวิธีการปัจจุบันนั้นได้รับการปรับให้เหมาะสม " หลังจากออกDebugger.Break()คำสั่งแล้วโปรดตรวจสอบให้แน่ใจว่าคุณกด F10 เพื่อไปยังคำสั่งถัดไป

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


2
นั่นมัน ฉันได้ลองวิธีแก้ปัญหาทั้งหมดข้างต้นแล้วและสิ่งเล็ก ๆ น้อย ๆ นี้ได้ผล .. ขอบคุณสำหรับการแบ่งปันฉันจะเสียเวลามากขึ้นโดยไม่ได้ดูคำใบ้เล็กน้อยนี้ ..
Krzysztof Szynter

nop ไม่ทำงาน. Vs17 ยังคงคิดว่าฉันกำลังดีบักโครงสร้างการวางจำหน่าย
John Demetriou

3

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


3

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

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


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

3

ฉันรู้ว่านี่เป็นคำตอบในภายหลัง แต่ฉันพบการอ้างอิงอีกวิธีหนึ่งเพื่อแก้ไขปัญหานี้ที่อาจช่วยเหลือผู้อื่นในอนาคต นี้หน้าเว็บอธิบายการตั้งค่าตัวแปรสภาพแวดล้อม (COMPLUS_ZapDisable = 1) ที่ป้องกันไม่ให้การเพิ่มประสิทธิภาพอย่างน้อยมันสำหรับฉัน! (อย่าลืมส่วนที่สองของการปิดใช้งานกระบวนการโฮสต์ Visual Studio) ในกรณีของฉันสิ่งนี้อาจมีความเกี่ยวข้องมากกว่าเดิมเพราะฉันทำการดีบัก DLL ภายนอกผ่านเซิร์ฟเวอร์สัญลักษณ์ แต่ฉันไม่แน่ใจ


3

ฉันมีปัญหากับโครงการ F # ที่เคยมาที่นี่และระหว่าง Visual Studio และ MonoDevelop ซึ่งอาจเกิดขึ้นในช่วงหลัง (ฉันลืม) ใน VS กล่องการปรับให้เหมาะสมไม่ได้ถูกตรวจสอบ แต่ดูเหมือนว่าการปรับให้เหมาะสมนั้นจะเกิดขึ้นมากที่สุดเท่าที่ตัวดีบักเกี่ยวข้อง

หลังจากเปรียบเทียบ XML ของไฟล์โครงการกับของไฟล์ที่สมบูรณ์แล้วปัญหานั้นชัดเจน: โครงการที่สมบูรณ์จะมี<optimize>false</optimize>บรรทัดที่ชัดเจนในขณะที่ไฟล์ที่ไม่ดีนั้นขาดหายไป VS เห็นได้ชัดว่าขาดการเพิ่มประสิทธิภาพที่ถูกปิดใช้งานในขณะที่คอมไพเลอร์กำลังทำสิ่งที่ตรงกันข้าม

วิธีแก้ไขคือการเพิ่มคุณสมบัตินี้ลงในไฟล์โครงการและโหลดซ้ำ


1

ฉันเริ่มได้รับข้อความนี้เมื่อฉันย้ายไปยัง Visual Studio 2017 ไม่มีแนวคิดใด ๆ ในหน้านี้ที่ฉันพยายามใช้งานได้ ในโพสต์อื่นฉันพบข้อเสนอแนะนี้และทำงาน DID - ลบ:

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]

... จากไฟล์ AssemblyInfo ของคุณ


รักคุณ @Crazy Cat มันเกิดขึ้นกับฉันเมื่อฉันย้ายไปที่ VS2019
Antonio Rodríguez

0

ฉันมีปัญหาเดียวกันใน VS 2010 ล้างข้อมูลและสร้างโซลูชันขึ้นใหม่และใช้งานได้


0

ความคิดเห็นของ vickramds ข้างต้นอ้างถึงhttp://torulflundgren.blogspot.com.au/2010/03/cannot-obtain-value-of-local-or.htmlสำหรับฉัน ฉันตรวจสอบทุกอย่าง - ลบ dll ทั้งหมด, ไฟล์ pdb จากโฟลเดอร์ถังขยะในท้องถิ่น, ล้าง, สร้างใหม่, ล้างโฟลเดอร์ทั้งหมดของไฟล์ ASP.NET ชั่วคราว, ตั้งค่าสถานะ TRACE / DEBUG, ตรวจสอบเส้นทาง DLL และอื่น ๆ

หากต้องการวางมันลงเพื่อไม่ให้สูญเสียสำหรับโครงการที่ได้รับผลกระทบ:

คุณสมบัติโครงการ -> สร้าง -> ขั้นสูง -> ข้อมูลการดีบัก: เต็ม

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


0

หากคุณกำลังพยายามแก้ไขข้อผิดพลาดในโครงการ ASP.NET ตรวจสอบให้แน่ใจว่าคุณสมบัติของโครงการ> เว็บ> เซิร์ฟเวอร์ดรอปดาวน์ถูกตั้งค่าเป็น "IIS Express" (นอกเหนือจากการตรวจสอบทุกอย่างที่นี่)


0

ฉันผสม csd / cli mfc extension ที่ผสมซึ่งได้รับการปรับให้เหมาะสมแม้ว่าการดีบักการกำหนดค่า (ดูจากหน้าต่างโมดูล VS 2017) ตามคำแนะนำก่อนหน้านี้ฉันขอเปลี่ยน "ใน VS2013 ไปที่: เครื่องมือ -> ตัวเลือก -> การดีบั๊ก -> ทั่วไปและเปิดใช้งาน 'ใช้โหมดความเข้ากันได้ที่มีการจัดการ' ซึ่งจะปิดใช้งานพฤติกรรมการประเมินฟังก์ชันใหม่" การตั้งค่านั้นพบได้ใน VS 2017

แต่นั่นยังไม่เพียงพอดังนั้นฉันจึงคัดลอกการตั้งค่า UseDebugL ไลบรารีจากไฟล์โครงการของแอพ MFC อื่นไปยังไฟล์นามสกุล dll โครงการ

    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
      ...
      <UseDebugLibraries>true</UseDebugLibraries>

จากนั้นสร้างใหม่และแก้ไขปัญหา


0

ใน Visual Studio 2012 เปิดใช้งานตัวเลือก "ที่มีการจัดการ " จากเครื่องมือ> การดีบัก> Just-In-Time ใช้งานได้สำหรับฉัน

ป้อนคำอธิบายรูปภาพที่นี่

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