คุณจะเปิดใช้งาน“ Enable .NET Framework ซอร์สสเต็ปปิ้ง” ได้อย่างไร?


118

อัปเดต 22 กุมภาพันธ์ 2556 : รายการ Microsoft Connect ได้รับทราบจาก Alok Shriram (Program Manager, Base Class Libraries, .NET Framework) ว่าปัญหาควรได้รับการแก้ไขแล้ว รายการเชื่อมต่อถูกทำเครื่องหมายว่าแก้ไขแล้ว (คงที่) :

ปัญหานี้ควรได้รับการแก้ไขแล้ว เราเผยแพร่การอัปเดตแหล่งอ้างอิง โปรดแจ้งให้เราทราบในกรณีที่ปัญหาของคุณยังไม่ได้รับการแก้ไข

ปีครึ่ง

ลิงค์โบนัส

คำถามเดิม

ฉันจะเปิดใช้งาน. NET Framework ซอร์สก้าวใน Visual Studio 2010 ได้อย่างไร


หมายเหตุ : คำถามนี้เป็นคำถามที่ใหญ่กว่าทั้งหมด:


Visual Studio 2010 มาพร้อมกับคุณสมบัติใหม่:

  • เครื่องมือตัวเลือกการดีบักทั่วไปเปิดใช้งานสเต็ปซอร์ส. NET Framework

ภาพหน้าจอของเมนูตัวเลือก

ทำตามคำแนะนำบนเพจ MSDN วิธีการ: ดีบัก. NET Framework Source :

เพื่อเปิดใช้งานการดีบักซอร์สของ. NET Framework

  1. ในการเครื่องมือเมนูคลิกตัวเลือก

  2. ในกล่องโต้ตอบตัวเลือกให้คลิกประเภทการดีบัก

  3. ในกล่องทั่วไปให้เลือกกล่องกาเครื่องหมายต่อไปนี้:

    • เปิดใช้งานการก้าวซอร์สของ. NET Framework
    • เปิดใช้งานการสนับสนุนเซิร์ฟเวอร์ต้นทาง

ฉันทำนี่:

ภาพหน้าจอของเมนูตัวเลือกโดยเน้นตัวเลือกที่เกี่ยวข้องที่เลือกไว้

หมายเหตุ : คุณจะสังเกตว่าหน้า MSDN บันทึกไว้และอย่างที่ฉันสังเกตเห็นว่าการตรวจสอบEnable .NET Framework source Stepจะยกเลิกการเลือกโดยอัตโนมัติ ** Enable Just My Code (Managed only) ฉันยังเปิดใช้งานข้อความวินิจฉัยของการสนับสนุนเซิร์ฟเวอร์ต้นทาง

การเปิดใช้งานตัวเลือกเหล่านั้นจะตั้งค่าตำแหน่งดาวน์โหลดแคชสัญลักษณ์ให้ฉันโดยอัตโนมัติ:

ภาพหน้าจอของเมนูตัวเลือกแสดงไดเรกทอรีแคช (ไฮไลต์)

หมายเหตุ : รายการMicrosoft Symbol Serverมีอยู่แล้ว (และไม่สามารถลบออกได้)


หน้า MSDN แจ้งว่าให้โหลดสัญลักษณ์:

ในการโหลดสัญลักษณ์ Framework โดยใช้หน้าต่างโมดูล

  1. ในหน้าต่างโมดูลให้คลิกขวาที่โมดูลที่ไม่ได้โหลดสัญลักษณ์ คุณสามารถบอกได้ว่ามีการโหลดสัญลักษณ์หรือไม่โดยดูที่คอลัมน์Symbols Status

  2. ชี้ไปที่โหลดสัญลักษณ์จากและคลิกMicrosoft Symbol Serversเพื่อดาวน์โหลดสัญลักษณ์จากเซิร์ฟเวอร์สัญลักษณ์สาธารณะของ Microsoft หรือ Symbol Path เพื่อโหลดจากไดเร็กทอรีที่คุณเก็บสัญลักษณ์ไว้ก่อนหน้านี้

ฉันลองสิ่งนี้:

ใส่คำอธิบายภาพที่นี่

จากนั้นสัญลักษณ์ทั้งหมดจะถูกโหลด:

ภาพหน้าจอของหน้าต่างโมดูลตามที่อธิบายไว้ข้างต้น

ฉันนั่งอยู่บนเบรกพอยต์ซึ่งกำลังจะเรียกเข้าสู่. NET framework code:

ภาพหน้าจอของรหัสที่ถอดเสียงด้านล่าง

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
    base.ScaleControl(factor, specified);

การกดF11ทำให้ดีบักเกอร์ข้ามไปยังบรรทัดถัดไป:

ภาพหน้าจอของรหัสที่ถอดเสียงด้านล่าง

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
    base.ScaleControl(factor, specified);

    //Record the running scale factor used
    this.scaleFactor = new SizeF(
            this.scaleFactor.Width * factor.Width,
            this.scaleFactor.Height * factor.Height);

ฉันจะเปิดใช้งานซอร์ส. NET Framework ที่ก้าวใน Visual Studio 2010 ได้อย่างไร


ฉันนั่งอยู่ที่จุดพักในรหัสของฉัน ฉันลองดับเบิลคลิกที่ฟังก์ชั่นที่อยู่ถัดไปใน call stack ฉันหวังว่าจะอนุญาตให้ฉันข้ามไปที่รหัส. NET:

ใส่คำอธิบายภาพที่นี่

ยกเว้นว่าจะใช้ไม่ได้: Visual Studio บอกฉันว่าไม่มีแหล่งที่มา:

ภาพหน้าจอของข้อความแสดงข้อผิดพลาดที่ระบุว่า No Source Available

ฉันจะเปิดใช้งานซอร์ส. NET Framework ที่ก้าวใน Visual Studio 2010 ได้อย่างไร


หากฉันเปลี่ยนไปใช้มุมมองการถอดชิ้นส่วนก่อนที่จะพยายามเข้าสู่รหัส. NET ( Debug -> Windows -> Disassembly ) ฉันจะเห็นcallรหัสใน. NET:

ภาพหน้าจอของรหัส

และเมื่อฉันทำฉันจบลงด้วยการดีบักการถอดชิ้นส่วนSystem.Windows.Forms.ScaleControl:

ภาพหน้าจอของหน้าต่างการถอดชิ้นส่วน

ซึ่งไม่เหมือนกับหรือมีประโยชน์เท่ากับความสามารถในการก้าวเข้าสู่ซอร์ส. NET Framework

ฉันจะเปิดใช้งานซอร์ส. NET Framework ที่ก้าวใน Visual Studio 2010 ได้อย่างไร


เส้นทางแคชสัญลักษณ์ที่กำหนดค่าบนคอมพิวเตอร์ของฉันมีไฟล์แคชสัญลักษณ์:

ภาพหน้าจอของรายการโฟลเดอร์

ดังนั้นจึงดาวน์โหลดpdbไฟล์สัญลักษณ์ แต่ปฏิเสธที่จะใช้

ฉันจะเปิดใช้งานซอร์ส. NET Framework ที่ก้าวใน Visual Studio 2010 ได้อย่างไร


Leppie แนะนำให้ฉันตรวจสอบDebugบันทึก (โดยเปิดหน้าต่างบันทึกการแก้ไขข้อบกพร่องมิฉะนั้นจะไม่บันทึกอะไรเลย):

Step into: Stepping over method without symbols 'System.Windows.Forms.Form.ScaleControl'

ก่อนหน้านี้ในบันทึกฉันเห็นมันกำลังโหลดสัญลักษณ์สำหรับSystem.Windows.Forms.dll:

Loaded 'C:\Windows\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll', Symbols loaded.

ใส่คำอธิบายภาพที่นี่

มันคือการค้นหาสัญลักษณ์ของฉัน แต่อ้างว่ามันไม่พบ

ฉันจะเปิดใช้งานซอร์ส. NET Framework ที่ก้าวใน Visual Studio 2010 ได้อย่างไร


ผู้ชายจาก Microsoft อิตาลีแนะนำให้ปิดต้องการไฟล์ต้นฉบับเพื่อให้ตรงกับเวอร์ชันดั้งเดิม :

ภาพหน้าจอของหน้าต่างตัวเลือก

นั่นไม่ได้แก้ไข

ฉันจะเปิดใช้งานซอร์ส. NET Framework ที่ก้าวใน Visual Studio 2010 ได้อย่างไร


มันได้รับการแนะนำว่ามีข้อผิดพลาดกับเซิร์ฟเวอร์แหล่งที่มาของ Microsoft สำหรับ.NET Framework 4.0 ตามคำแนะนำนั้นฉันเปลี่ยนโครงการเป็นเป้าหมาย. NET Framework 3.5 :

ใส่คำอธิบายภาพที่นี่

นั่นไม่ได้แก้ไข

ฉันจะเปิดใช้งานซอร์ส. NET Framework ที่ก้าวใน Visual Studio 2010 ได้อย่างไร


มีบางคนสงสัยว่าบุคคลอื่นที่ประสบปัญหาเดียวกันกำลังใช้โปรแกรมดีบั๊กรุ่น 64 บิตหรือไม่ ตอนนี้ไม่มี Visual Studio เวอร์ชัน 64 บิต แต่ฉันลองเปลี่ยนโปรเจ็กต์จากAnyCPUเป็นx86 (กำลัง JITed เป็น x64) ในกรณีที่ Microsoft ไม่รองรับโปรเซสเซอร์ 64 บิต:

ใส่คำอธิบายภาพที่นี่

นั่นไม่ได้แก้ไข:

Step into: Stepping over method without symbols 'System.Windows.Forms.Form.ScaleControl'

ฉันจะเปิดใช้งานซอร์ส. NET Framework ที่ก้าวใน Visual Studio 2010 ได้อย่างไร


ดูสิ่งนี้ด้วย


คุณตรวจสอบซอร์สโค้ด 'แคช' แล้วหรือยัง?
leppie

@leppie "ซอร์สโค้ด" แคช "" หมายความว่าอย่างไร หากคุณหมายถึงโฟลเดอร์ที่เก็บซอร์สโค้ดไว้โฟลเดอร์นั้นจะถูกเติม (ดูอัปเดต 4 )
Ian Boyd

ใช่. เป็นไปได้ไหมที่จะเปิดไฟล์ต้นฉบับและตั้งค่าเบรกพอยต์
leppie

1
เขียนประเด็นได้ดีเยี่ยม!
andersonbd1

1
มันใช้ไม่ได้ใน VS2012 เช่นกัน ใช้งานได้หนึ่งวันหลังจากที่ฉันกำหนดค่าทุกอย่างและเพิ่งหยุดทำงาน สองวันหลายสิบกาแฟหลายร้อยหน้าเว็บต่อมาก็ใช้ไม่ได้ ในขณะเดียวกันแหล่งที่มาที่เผยแพร่โดย symbolource.org ก็ทำงานได้อย่างมีเสน่ห์
Wiktor Zychla

คำตอบ:


35

PDB สำหรับการก้าวผ่านซอร์สโค้ดจะถูกโพสต์สำหรับ RTM และ Service Pack เท่านั้น ด้วยเหตุนี้เมื่อการอัปเดตความปลอดภัยออกมาและแก้ไข dll ที่คุณพยายามดีบักก็จะทำให้ขั้นตอนต้นทางไม่ทำงาน (นั่นคือคุณจะได้รับ "ไม่มีแหล่งที่มาพร้อมใช้งาน" พร้อมกับ "เรียกดูเพื่อค้นหาแหล่งที่มา" ")

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

วิธีแก้ปัญหา

  1. ระบุ dll ที่คุณต้องการดีบัก (เช่น System.Windows.Forms.dll)
  2. ในขณะที่ดีบักเปิดหน้าต่างโมดูลใน Visual studio ค้นหาคอลัมน์เวอร์ชัน หากเวอร์ชันนั้นไม่ใช่เวอร์ชัน RTM หรือ Service pack คุณจะต้องทำเวิร์กโฟลว์ โดยทั่วไปแล้ว RTM dll จะพูดว่า "สร้างโดย: RTMRel" แม้ว่า dll ที่เป็นส่วนหนึ่งของการอัปเดตความปลอดภัยจะระบุว่า "สร้างโดย: RTMGDR" หมายเหตุหมายเลขเวอร์ชัน (เช่น 4.0.30319.269 สร้างโดย: RTMGDR)
  3. ตอนนี้เราต้องการค้นหาการอัปเดตที่สร้างเวอร์ชันนี้ ทำได้โดยค้นหา dll และหมายเลขเวอร์ชันที่ support.microsoft.com/kb/ ตัวอย่างเช่นฉันค้นหาโดย Google ต่อไปนี้: site:support.microsoft.com/kb System.Windows.Forms.dll 4.0.30319.269
  4. การค้นหาควรแสดงข้อมูลเกี่ยวกับการอัปเดต สังเกตหมายเลข KB ในแถบที่อยู่ ในตัวอย่างของฉันที่อยู่คือ http://support.microsoft.com/kb/2604121KB2604121 คือสิ่งที่เราสนใจ
  5. ไปที่ Control Panel-> Programs and Features แล้วคลิก "View Installed Updates"
  6. ค้นหาการอัปเดตซึ่งแสดงรายการหมายเลข KB (คุณสามารถใช้การค้นหาในช่องด้านขวาบน)
  7. ถอนการติดตั้งการอัปเดตนั้น
  8. ทำซ้ำขั้นตอนนี้สำหรับ dll เดียวกันนี้จนกว่า dll จะกลับไปเป็นเวอร์ชัน RTMRel หรือเวอร์ชัน SP ตัวอย่างเช่นสำหรับ System.Windows.Forms.dll ฉันต้องลบ KB2686827, KB2604121, KB2518870 ก่อนที่จะกลับไปเป็นเวอร์ชัน RTMRel

คุณจะต้องทำสิ่งนี้สำหรับแต่ละ dll ภายใน. NET framework ที่คุณสนใจเกี่ยวกับการดีบัก

เมื่อเสร็จแล้วให้ตั้งค่าเบรกพอยต์ภายในซอร์ส. net (ตัวอย่างเช่นไปที่แท็บเบรกพอยต์พูด New-> Break at Function แล้วเข้า System.Windows.Forms.Form.Form) หรือเข้าสู่. net วิธีการใน dll นั้น


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

ฉันไม่สามารถถอนการติดตั้งโปรแกรมปรับปรุงความปลอดภัย ผิดนโยบายของ บริษัท มีวิธีรับสำเนา mscorlib.dll (และอื่น ๆ ) ที่ตรงกับเซิร์ฟเวอร์ Microsoft Symbols หรือไม่ mscorlib.dll ของฉันคือเวอร์ชัน 4.0.30319.269 (RTMGDR.030319-2600) เป็นไปได้ว่าฉันสามารถอัปเดต GAC ชั่วคราวด้วย DLL ใหม่นี้และลองใช้ Source Stepping
kevinarpe

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

สาเหตุที่เป็นไปได้ว่า Microsoft ไม่ปล่อยซอร์สสำหรับการอัปเดตด้านความปลอดภัยคือบางคนสามารถเปรียบเทียบการเปลี่ยนแปลงโค้ดทำความเข้าใจว่าช่องโหว่ด้านความปลอดภัยคืออะไรและสร้างช่องโหว่ของตนเอง สิ่งที่ Microsoft ไม่ทราบคือ"ซอร์สโค้ด"มีให้ใช้งานแล้วโดยใช้ ILSpy หรือ Relfector ดังนั้นการที่ Microsoft ไม่ปล่อยซอร์สโค้ดนั้นไม่ได้ทำให้ทุกคนปลอดภัยมากขึ้น แต่นักพัฒนาเท่านั้นที่ใช้ชีวิตยากขึ้น
Ian Boyd

2
@IanBoyd ฉันสงสัยว่านั่นเป็นแรงจูงใจของ MS ฉันถือว่าเวิร์กโฟลว์ของพวกเขาไม่รองรับการอัปเดตแหล่ง PDB สำหรับการดีบัก ส่วนใหญ่เกี่ยวข้องกับการปิดช่องโหว่ด้านความปลอดภัย
xanadont

6

ในขณะที่โชคไม่ดีที่มีปัญหากับ Microsoft ดังที่ Leppie ชี้ให้เห็น (และฉันก็ได้รับผลเช่นเดียวกัน

ควรสังเกตว่าความพยายามของคุณจะล้มเหลวอยู่ดีเนื่องจากคุณอ้างถึง:

  • Microsoft Symbol Server

แทน:

  • referencesource.microsoft.com/symbols

ดูส่วนคำถามที่พบบ่อย / การแก้ไขปัญหาของการกำหนดค่า Visual Studio เพื่อดีบักซอร์สโค้ด. NET Framework


4

ฉันได้พบคำตอบแล้วฉันคิดว่า

ฉันสืบหาสิ่งที่เกิดขึ้นกับ Fiddler ดูเหมือนว่ามีเฉพาะสัญลักษณ์เท่านั้นและไม่มีแหล่งที่มา

เมื่อ VS พยายามโหลดสัญลักษณ์จากเซิร์ฟเวอร์ 'แหล่งอ้างอิง' มันล้มเหลว (404) เนื่องจากล้มเหลวฉันคิดว่าจึงไม่สามารถแมปกับไฟล์ต้นฉบับบนเซิร์ฟเวอร์นั้นได้

http://referencesource.microsoft.com/symbols/mscorlib.pdb/ED96A7F38A2940F39B9CA7AD9BC5CB671/mscorlib.pdb

หลังจากความล้มเหลวข้างต้นมันจะลองเซิร์ฟเวอร์บางตัวที่เรียกว่า 'msdl' ซึ่งพบ PDB จริง (แต่ดูเหมือนว่าเครื่องนี้ไม่มีข้อมูลซอร์สโค้ด)

http://msdl.microsoft.com/download/symbols/mscorlib.pdb/ED96A7F38A2940F39B9CA7AD9BC5CB671/mscorlib.pd_

สรุปแล้วดูเหมือนว่าจะเป็นปัญหา (ชั่วคราว) ของ Microsoft กับเซิร์ฟเวอร์ของตน

ฉันแน่ใจว่าฉันมีซอร์สโค้ดอยู่พักหนึ่ง แต่ตอนนี้ใช้งานไม่ได้แล้ว

แก้ไข:

ฉันลองใช้กับ. NET เวอร์ชันต่างๆผลลัพธ์เดียวกันทั้งหมด :(


1
ดีที่จะเป็นที่น่าสนใจมากถ้าขั้นตอนที่แน่นอนของฉันควรทำงาน ( แต่ไม่ได้) จะทำงาน (ในอนาคต) และทำงาน ( แต่ไม่ใช่วันนี้) มันจะน่าหงุดหงิดเป็นพิเศษเพราะฉันใช้เวลา 11 ชั่วโมงกับปัญหานี้
Ian Boyd

2
msdl.microsoft.com ดูเหมือนจะเป็น Microsoft Symbol Server
yoel halb

2
และมันพังอีกครั้ง
Simon_Weaver

ดูเหมือนว่าจะไม่ใช่ "ปัญหาเซิร์ฟเวอร์ชั่วคราว" 7 ปีต่อมาและลิงก์ต่างๆก็ยังคงใช้งานไม่ได้
ก.ค.


1

ในกรณีของผมผมก็แก้จุดบกพร่องเก่าNET 2.0 WinFormsใบสมัครและผมได้"ที่มาไม่สามารถใช้งาน"ข้อความ ฉันลองใช้การตั้งค่าที่แนะนำทั้งหมดแล้ว

ท้ายที่สุดฉันสร้างแอปขึ้นมาใหม่เพื่อกำหนดเป้าหมายเป็น. NET 4.5ชั่วคราวและสามารถทำให้แหล่งที่มาทำงานได้ บางทีแอปของฉันอาจเก่าเกินไปสำหรับการเปลี่ยนแหล่งที่มา ฉันรู้ว่ามันเอาชนะจุดประสงค์ได้ แต่สำหรับการทดสอบที่รวดเร็วและสกปรกมันได้ผล ข้อผิดพลาดที่ผมมีคือยังคงอยู่ใน.NET 4.5 :)

กรอบเป้าหมาย


0

คุณสามารถหาแหล่งอ้างอิงได้ที่นี่ซึ่งมีให้ดาวน์โหลด:

แหล่งอ้างอิง. NET Framework 4.0

แหล่งที่มาของ WCF, WF และแม้แต่ 4.5 Beta / RC และอื่น ๆ อีกมากมายสามารถพบได้ที่นั่นเช่นกัน:

Microsoft Referencesource NetFramework


3
ซอร์สโค้ดจะไร้ประโยชน์หากไม่มีสัญลักษณ์ เว้นแต่คุณจะชอบค้นหาโค้ดเฉพาะ p
leppie

0

นี่คือคำแนะนำอย่างเป็นทางการhttps://referencesource.microsoft.com/setup.html

กำหนดค่า Visual Studio 2013 สำหรับการดีบัก. NET framework

ในการกำหนดค่า Visual Studio 2013 ให้ทำดังต่อไปนี้ในเมนู Tools -> Options -> Debugging -> General:

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

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