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


211

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

Cannot obtain value of local or argument as it is not available at this instruction pointer, possibly because it has been optimized away.

2
ฉันมีปัญหาเดียวกันทั้งหมดและฉันใช้ Debug build Cannot obtain value of local or argument '<this>' as it is not available at this instruction pointer, possibly because it has been optimized away. System.Threading.Tasks.TaskExceptionHolder
javapowered

19
โอ๊ะฉันเพิ่งได้รับการคัดเลือกโดยไม่ได้ตั้งใจ ..
แดเนียลเล็ก ๆ น้อย ๆ

ฉันพบปัญหานี้ใน VS 2017 และฉันได้ทำตามคำแนะนำทั้งหมดในโพสต์ด้านล่าง มีตัวเลือกอื่น ๆ อีกไหม?
แมตต์ W

อย่าลืมสร้างเมนู -> เครื่องมือจัดการการกำหนดค่า การกำหนดค่าจะต้องตั้งค่าเป็น Debug ที่นั่นหรือคุณยังพบปัญหาอยู่
บ๊อบ Clegg

คำตอบ:


344

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

นอกจากนี้ตั้งค่าแบบเลื่อนลง "ข้อมูลการแก้ปัญหา" เป็น "เต็ม" ในตัวเลือกขั้นสูง (ภายใต้แท็บสร้าง)


128
ก่อนอื่นให้ตรวจสอบว่า Build Configuration is Debug ไม่ใช่ Release
ApceH Hypocrite

โดยวิธีการถ้าคุณต้องการทดสอบในโหมด Release คุณสามารถเพิ่ม "Debugger.Launch ();" ในรหัส
Jason

ทำทั้งสองขั้นตอนและเปลี่ยนการกำหนดค่าจาก "Release" เป็น "Build" ทำงานบน Visual Studio 2017 Community Edition
Neo

1
หากคุณมี VS 2017 ทั้งคำตอบที่ได้รับการยอมรับและคำตอบโดย xyq.384.b จะช่วยได้ สำหรับฉัน xyq.384.b คำตอบคือการแก้ไขเนื่องจากเป็น JIT debugger ที่ระงับตัวชี้ ... ฉันขอโทษ JIT "
optimization

หลังจากเปลี่ยนไปใช้การตั้งค่าการดีบักฉันค้นพบกล่องรหัสการปรับให้เหมาะสมไม่ได้ตรวจสอบ เรียนรู้บทเรียน: อย่าดีบักในโหมดการกำหนดค่าการเปิดตัว
eliteproxy

135

นอกจากนี้ใน VS 2015 Community Edition

ไปที่ Debug-> Options หรือ Tools-> Options

และตรวจสอบการดีบัก -> ทั่วไป -> ระงับการเพิ่มประสิทธิภาพ JIT บนโหลดโมดูล (จัดการเท่านั้น)


7
วิธีนี้แก้ไขปัญหาของฉันหลังจากใช้วิธีแก้ไขปัญหาทั้งหมดที่กล่าวถึงข้างต้น
masih

1
ไม่มีคำตอบที่แนะนำสำหรับฉัน ตัวแปรของฉันยังคงได้รับการปรับปรุงให้ดีที่สุด ...
Sushi271

ไม่มีความคิดว่าทำไมสิ่งนี้เพิ่งเริ่มเกิดขึ้น .. แต่สิ่งนี้แก้ไขได้!
Murphybro2

อึศักดิ์สิทธิ์นี่มันแก้ไขสำหรับฉันในชุมชน VS2017 ด้วย! ไม่มีความคิดว่าตัวเลือกนี้จะถูกยกเลิกเมื่อใดหรืออย่างไร ...
Ian Kemp

ทำงานเหมือนแชมป์!
BillRuhl

59

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

SomeType value = GetValue();
DoSomething(value);

valueโดยทั่วไปแล้วตัวแปรโลคัลจะถูกลบออกโดยเก็บค่าไว้ในสแต็กแทน - เหมือนว่าคุณเขียน:

DoSomething(GetValue());

นอกจากนี้หากค่าส่งคืนไม่ได้ใช้เลยค่าจะถูกส่งผ่าน "ป๊อป" (แทนที่จะเก็บไว้ใน Local ผ่าน "stloc" และอีกครั้ง; ท้องถิ่นจะไม่มีอยู่)

ด้วยเหตุนี้ในการสร้างดีบักไม่สามารถรับค่าปัจจุบันของvalueเพราะมันไม่ได้อยู่ - มันมีอยู่เพียงสำหรับทันทีสั้น ๆ ระหว่างและGetValue()DoSomething(...)

ดังนั้น; ถ้าคุณต้องการดีบัก ... อย่าใช้ build build! หรืออย่างน้อยปิดการใช้งานการเพิ่มประสิทธิภาพในขณะที่คุณแก้ปัญหา


4
ขอบคุณสำหรับคำตอบของคุณ - แต่ฉันตรวจสอบคุณสมบัติโค้ดเพิ่มประสิทธิภาพในโครงการของฉันและมันไม่ได้ถูกเลือก = (
อยากรู้อยากเห็น

4
@ Marc - ฉันเข้าใจสิ่งที่คุณพูด แต่ฉันใช้ไลบรารีแหล่งอ้างอิงของ microsoft เพื่อเขียนรหัสผ่านอึของพวกเขาเอง ตอนนี้ฉันกำลังเดินผ่านวิธีต่าง ๆ แต่ฉันไม่สามารถดูค่าของคนในท้องถิ่นได้ จุดของการดีบักแหล่ง. Net คืออะไร ข้อเสนอแนะใด ๆ stackoverflow.com/questions/13147132/…
one.beat.consumer

ฉันดูเหมือนจะทำสิ่งเดียวกันกับ @ one.beat.consumer: พยายามก้าวผ่านสัญลักษณ์สาธารณะของ Microsoft เพื่อทำความเข้าใจว่าทำไมกรอบ ASP.NET ไม่ทำงาน ในกรณีของฉันแบบจำลองมีผลผูกพันใน MVC 3 ...
bambams

@ one.beat.consumer ฉันสมมติว่ามีการอ้างอิง microsoft ที่คอมไพล์ด้วยการเพิ่มประสิทธิภาพที่เปิดใช้งานดังนั้นแม้ว่าคุณสามารถดาวน์โหลดซอร์สโค้ดของพวกเขาเพื่อดูขั้นตอนผ่านค่าที่หายไปเช่นเดียวกับถ้าคุณรวบรวมโครงการของคุณด้วยการปรับให้เหมาะสม เปิดการใช้งาน เป็นโปรเจ็กต์เฉพาะ (dll) - หากคุณสามารถรับรุ่น "debug" ของการอ้างอิง MS ได้คุณจะเห็นค่าได้ อย่าลืมว่าถ้า MS dll ถูกอ้างอิงโดยโครงการอื่นที่โครงการหลักของคุณอ้างถึง "subreference" อาจตรงกับการตั้งค่าของโครงการอื่น
drzaus

22

http://www.guntucomputerhacks.blogspot.com.au/2014/07/cannot-obtain-value-of-local-or.html

สิ่งนี้ใช้ได้กับฉันใน visual studio 2013

สิ่งที่คุณต้องทำคือ ..

  1. คลิกเมาส์ขวาที่โครงการที่คุณไม่สามารถดีบักได้
  2. ไปที่กรรมสิทธิ์ของโครงการ
  3. คลิกที่เมนูสร้าง
  4. คลิกที่ปุ่มขั้นสูง
  5. ตั้งค่าการเลื่อนลงข้อมูล debug ให้เต็ม
  6. สร้างโครงการของคุณใหม่

20

ฉันเพิ่งพบเจอสิ่งนี้และฉันกำลังทำงานภายใต้Releaseการกำหนดค่าการสร้างแทนการDebugกำหนดค่าการสร้าง เมื่อฉันเปลี่ยนกลับไปที่Debugตัวแปรของฉันแสดงให้เห็นในนาฬิกาอีกครั้ง



8

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


6

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


1
ข้อเสนอแนะที่สองทำให้มันทำงานได้อีกครั้งขอบคุณ!
CodeMilian

1
ใน VS 2015 Enable unmanaged code debuggingผมไม่เห็น มีEnable native code debuggingฉันลองตรวจสอบสิ่งนี้ แต่ก็ไม่ได้ทำให้แตกต่าง
Al Lelopath

1
ใน VS 2015 ฉันตรวจสอบการเปิดใช้งาน "รหัสพื้นเมือง" ในการสร้างโครงการ, เว็บ, ดีบั๊กและทุกอย่างทำงานได้
Mouffette

6

ผมได้ประสบปัญหาเดียวกันและวิธีการแก้ปัญหาสำหรับฉันคือการเปลี่ยนแปลงSolution ConfigurationจากการRelease Debugหวังว่ามันจะช่วย


4

ในกรณีของฉันฉันกำลังทำงานในโครงการ web api และถึงแม้ว่าโครงการได้ตั้งค่าอย่างถูกต้องเป็น debug เต็มฉันยังคงเห็นข้อผิดพลาดนี้ทุกครั้งที่ฉันแนบกับกระบวนการ IIS ที่ฉันพยายามดีบัก จากนั้นฉันก็ตระหนักว่าโปรไฟล์การเผยแพร่ถูกตั้งค่าให้ใช้การกำหนดค่าการเผยแพร่ อีกที่ที่ควรตรวจสอบคือโปรไฟล์การเผยแพร่ของคุณหากคุณใช้คุณสมบัติ 'เผยแพร่' ของโครงการ dotnet web api ของคุณ


3

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


1

เป็นคำตอบเพิ่มเติมสำหรับผู้ที่ประสบปัญหานี้เมื่อทำการดีบั๊กแอพพลิเคชั่นเว็บของเว็บไซต์ Azure:

เมื่อปรับใช้จาก GitHub ตัวอย่างเช่นรหัสจะถูกรวบรวมในเซิร์ฟเวอร์ Azure ที่ปรับให้เหมาะสมโดยค่าเริ่มต้น

ผมบอกเซิร์ฟเวอร์เพื่อรวบรวมในวิธีแก้ปัญหาได้โดยการตั้งค่าSCM_BUILD_ARGSไป/p:Configuration=Debug

แต่มีตัวเลือกเพิ่มเติม ดูสิ่งนี้: http://azure.microsoft.com/blog/2014/05/08/introduction-to-remote-debugging-on-azure-web-sites-part-3-multi-instance-environment-and-git /


1

ใน Visual Studio 2012:

ไปที่คุณสมบัติโครงการ -> แก้ไขข้อบกพร่อง -> ยกเลิกการเลือก "เปิดใช้งานกระบวนการโฮสต์ Visual Studio"


1

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

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


0

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

แอตทริบิวต์ debuggable ของฉันถูกตั้งค่าเป็น: DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints ซึ่งอ้างอิงจากบทความ MSDN นี้บอกคอมไพเลอร์ JIT เพื่อใช้การปรับให้เหมาะสม ฉันลบบรรทัดนี้ออกจากไฟล์ AssemblyInfo.cs ของฉันและตัวแปรในเครื่องก็ใช้ได้


0

ใน Visual Studio 2017 หรือ 2015:

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


0

ฉันมีปัญหาเดียวกัน พยายามทั้งหมดข้างต้นและพบว่าฉันต้องลบทุกอย่างภายใน {PROJECT_ROOT} \ bin \ Release \ netcoreapp2.2 และ {PROJECT_ROOT} \ obj \ Release \ netcoreapp2.2 สำหรับโครงการของฉัน แน่นอนว่ามันเกี่ยวข้องกับการเผยแพร่เพราะแม้ว่าฉันจะใช้เครื่องมือการปรับใช้ / bitbucket บน Azure Web App ของฉันฉันก็ลอง Build >> Publish >> Publish to Azure เพราะฉันต้องการตรวจสอบว่าไฟล์ใดที่ถูกปรับใช้จริง


0

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

  • ช่องทำเครื่องหมาย" เพิ่มประสิทธิภาพรหัส " ยกเลิกการทำเครื่องหมาย
  • " ยกเลิกการเพิ่มประสิทธิภาพ JIT ในการโหลดโมดูล "
  • การกำหนดค่าโซลูชันบนDEBUG

โมดูลยังคงถูกปรับให้เหมาะสม ดูภาพหน้าจอต่อไปนี้: โมดูลที่ปรับให้เหมาะสม


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

ดับเบิลคลิกที่โปรแกรมของคุณใน " Process panel " จากนั้นในหน้าต่างใหม่เปิดแท็บ " . NET Assemblies " จากนั้นในคอลัมน์ " เส้นทางภาพพื้นเมือง " คุณจะพบทุกเส้นทางโมดูลเพิ่มประสิทธิภาพ ค้นหาที่คุณต้องการยกเลิกการเพิ่มประสิทธิภาพและลบโฟลเดอร์ (ดูภาพหน้าจอด้านล่าง): ป้อนคำอธิบายรูปภาพที่นี่ (ฉันเบลอชื่อ บริษัท ของฉันด้วยเหตุผลที่ชัดเจน)

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

หมายเหตุ : ไฟล์อาจถูกล็อคเมื่อมันถูกเปิดโดยกระบวนการอื่นลองปิด Visual Studio หากไฟล์ยังคงล็อคอยู่คุณสามารถใช้โปรแกรมเช่นLock Hunter

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