如何为间歇性崩溃的devenv.com获取调用堆栈?

时间:2009-05-07 15:17:49

标签: visual-studio-2005 debugging callstack

我有一个每晚构建的DOS批处理脚本,它调用devenv.exe来构建解决方案文件。我经常发现devenv.com崩溃。我得到一个DW20.exe“分享你的痛苦”对话框。

1)如果按下Debug按钮,我没有看到通常的“选择你的调试器”窗口。相反,它什么都不做。

2)如果我启动Visual Studio并尝试连接到devenv.com,它会说应用程序似乎已陷入僵局或等待操作完成。 (我认为因为它是由DW20.exe调试的)

你会建议我做一个体面的调用堆栈吗?

修改

我成功地让WinDBG附加了。执行k命令。以下内容是否看起来像可以传递给编译器团队的有意义的东西?有没有办法查看当前的异常?

(e90.fb8): Break instruction exception - code 80000003 (!!! second chance !!!)
eax=0012ccb8 ebx=04ed2750 ecx=0111bdc4 edx=5a57f004 esi=00000000 edi=14ed1000
eip=77e4bef7 esp=0012ccb4 ebp=0012cd08 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\WINDOWS\system32\kernel32.dll - 
kernel32!RaiseException+0x3c:
77e4bef7 5e              pop     esi
Missing image name, possible paged-out or corrupt data.
Missing image name, possible paged-out or corrupt data.
Missing image name, possible paged-out or corrupt data.
Missing image name, possible paged-out or corrupt data.
0:000> k
ChildEBP RetAddr  
WARNING: Stack unwind information not available. Following frames may be wrong.
0012cd08 5a760cf1 kernel32!RaiseException+0x3c
0012cd58 5a766105 cslangsvc!InMemoryCompile+0x4c6c1
0012cd7c 5a767375 cslangsvc!InMemoryCompile+0x51ad5
0012cd84 5a767637 cslangsvc!InMemoryCompile+0x52d45
00000000 00000000 cslangsvc!InMemoryCompile+0x53007

我想让!analyze -v工作。

0:000> !analyze -v
*******************************************************************************
*                                                                             *
*                        Exception Analysis                                   *
*                                                                             *
*******************************************************************************

***** OS symbols are WRONG. Please fix symbols to do analysis.

*************************************************************************
***                                                                   ***
***                                                                   ***
***    Your debugger is not using the correct symbols                 ***
***                                                                   ***
***    In order for this command to work properly, your symbol path   ***
***    must point to .pdb files that have full type information.      ***
***                                                                   ***
***    Certain .pdb files (such as the public OS symbols) do not      ***
***    contain the required information.  Contact the group that      ***
***    provided you with these symbols if you need this command to    ***
***    work.                                                          ***
***                                                                   ***
***    Type referenced: ntdll!_PEB                                    ***
***                                                                   ***
*************************************************************************
c0000005 Exception in ext.analyze debugger extension.
PC: 014d7875  VA: 00000000  R/W: 0  Parameter: 0001003f

编辑2

我发现WinDBG有这些精彩的SOS扩展。显然我可以用它们来调试C#编译器...

0:000> !PrintException
There is no current managed exception on this thread
0:000> !clrstack
OS Thread Id: 0x9fc (0)
ESP       EIP     
0012ee08 77e4bef7 [ComPlusMethodFrameGeneric: 0012ee08] Microsoft.Build.Tasks.Hosting.ICscHostObject.Compile()
0012ee18 6be671ab Microsoft.Build.Tasks.Csc.CallHostObjectToExecute()
0012ee48 6c0aed17 Microsoft.Build.Utilities.ToolTask.Execute()
0012ee7c 6bcbb348 Microsoft.Build.BuildEngine.TaskEngine.ExecuteTask(ExecutionMode, System.Collections.Hashtable, Microsoft.Build.BuildEngine.BuildPropertyGroup, Boolean ByRef)
0012ef24 6bcadf87 Microsoft.Build.BuildEngine.Target.ExecuteAllTasks(Microsoft.Build.BuildEngine.DependencyAnalysisResult, System.Collections.Hashtable, System.Collections.Hashtable, Microsoft.Build.BuildEngine.ItemBucket, System.Collections.ArrayList, Microsoft.Build.BuildEngine.BuildPropertyGroup)
0012efa0 6bcac7c0 Microsoft.Build.BuildEngine.Target.ExecuteAllTasks()
0012efec 6bcad05b Microsoft.Build.BuildEngine.Target.Build(System.Collections.IDictionary)
0012f070 6bcacfa6 Microsoft.Build.BuildEngine.Target.Build(System.Collections.IDictionary)
0012f0f4 6bcacfa6 Microsoft.Build.BuildEngine.Target.Build(System.Collections.IDictionary)
0012f178 6bcacfa6 Microsoft.Build.BuildEngine.Target.Build(System.Collections.IDictionary)
0012f1fc 6bc9b20d Microsoft.Build.BuildEngine.Project.DoBuild(System.String[], System.Collections.IDictionary, Boolean)
0012f250 6bca2134 Microsoft.Build.BuildEngine.Engine.BuildProject(Microsoft.Build.BuildEngine.Project, System.String[], System.Collections.IDictionary, Microsoft.Build.BuildEngine.BuildSettings, Boolean)
0012f2ac 6bc9af03 Microsoft.Build.BuildEngine.Project.Build(System.String[], System.Collections.IDictionary)
0012f2c0 04711a36 Microsoft.VisualStudio.Build.ComInteropWrapper.ProjectShim.BuildTarget(System.String, System.Collections.IDictionary)
0012f4f4 79f68cde [GCFrame: 0012f4f4] 
0012f650 79f68cde [ComMethodFrame: 0012f650] 

我仍然在寻找一种检查异常内容的方法。 !PrintException没有发现任何异常。

3 个答案:

答案 0 :(得分:1)

您可以尝试安装Debugging Tools for Windows然后使用-iae选项(对于NTSD / CDB)或-I选项(对于WinDBG)使该程序包中的一个调试程序为JIT / AeDebug调试器。

答案 1 :(得分:0)

我终于找到了错误编译器的异常类型和callstack。我这样做是通过保存一个完整的转储文件(.dump / ma c:\ myCSCdump.dmp),然后打开转储文件,就像在VS2005中打开任何其他项目文件一样。按下运行按钮在调用堆栈窗口中生成以下内容:

kernel32.dll!_RaiseException@16()  + 0x3c bytes 
  

cslangsvc.dll!ALLOCHOST :: ThrowOutOfMemoryException()+ 0x10 bytes
      cslangsvc.dll!PAGEHEAP :: AllocPages()+ 0xc1fd8 bytes
      cslangsvc.dll!SYMTBL :: GrowTable()+ 0x5b字节       cslangsvc.dll!BSYMMGR :: AddChild()+ 0x3b字节       cslangsvc.dll!BSYMMGR :: CreateGlobalSym()+ 0x2ba字节       cslangsvc.dll!BSYMMGR :: CreateMethod()+ 0xc bytes
      cslangsvc.dll!IMPORTER :: ImportMethod()+ 0x1d9 bytes
      cslangsvc.dll!IMPORTER :: DefineImportedType()+ 0x3b2个字节       cslangsvc.dll!CLSDREC :: prepareAggregate()+ 0x8d bytes       cslangsvc.dll!COMPILER :: ForceAggStates()+ 0x8e bytes
      cslangsvc.dll!COMPILER :: ForceAggStates()+ 0x127字节       cslangsvc.dll!COMPILER :: EnsureState()+ 0x2e个字节       cslangsvc.dll!CLSDREC :: CheckForTypeErrors()+ 0x23字节
      cslangsvc.dll!CLSDREC :: CheckForTypeErrors()+ 0x2ba bytes
      cslangsvc.dll!CLSDREC :: CheckForTypeErrors()+ 0x80 bytes
      cslangsvc.dll!CLSDREC :: CheckForTypeErrors()+ 0x8a bytes
      cslangsvc.dll!CLSDREC :: CheckForTypeErrors()+ 0x8a bytes
      cslangsvc.dll!CLSDREC :: CheckForTypeErrors()+ 0x8a bytes
      cslangsvc.dll!COMPILER :: CheckForTypeErrors()+ 0x100字节       cslangsvc.dll!COMPILER :: CompileAll()+ 0x546字节       cslangsvc.dll!COMPILER :: Compile()+ 0x7c bytes       cslangsvc.dll!CController :: RunCompiler()+ 0x177字节       cslangsvc.dll!CController :: Compile()+ 0x16 bytes
      cslangsvc.dll!CCSharpProjectSite :: BuildProjectCore()+ 0x5a bytes
      cslangsvc.dll!CProjectSite :: BuildProject()+ 0x11字节
      csproj.dll!CCSharpBuildCompiler :: DoMainBuild()+ 0x88字节
      csproj.dll!CCscMSBuildHostObject :: Compile()+ 0x4e bytes
      mscorwks.dll!_CLRToCOMWorker@8()+ 0x171 bytes

答案 2 :(得分:0)

这有点罗嗦,所以我会将其作为回复发布。它来自Microsoft Connect网站,以回应我的问题。读者可能会发现它相关:

日期:2009年5月7日星期四19:14:52 -0700

来自Microsoft Connect的问候!

此通知是针对反馈项生成的:您在Microsoft Connect站点上提交的每夜构建问题(存储桶365749762)。

感谢您报告了Visual Studio 2005遇到的这个问题,感谢您提供的转储!

看起来问题出现在cslangsvc.dll(进程内C#编译器)中,DevEnv正在调用它来执行构建。

我们建议解决这个问题 尝试使用MSBuild代替你做夜间构建,因为这应该比自动化DevEnv / build更强大。具体来说,您可能会避免这个特殊问题,因为MSBuild将使用csc.exe进行编译而不是cslangsvc.dll。

我们不太可能有进一步的VS 2005版本来解决cslangsvc问题,因此我正在解决此错误无法修复,但如果您在使用MSBuild时仍然看到问题,请重新激活它

再次感谢有关此问题的所有信息!

亚历克斯特纳 项目经理 Visual C#编译器