VS 2012 cmdlet远程调试不会在断点处停止

时间:2014-02-25 13:01:12

标签: c# debugging powershell visual-studio-2012

我为Exchange 2010管理编写了一个cmdlet。所以我需要在Exchange 2010服务器上调试它。 我在虚拟机上启动了Exchange 2010(我在VS2012上启动了)。

我的调试计划如下。作为构建后操作,我设置了以下内容:

cmd.exe /c copy $(TargetPath) \\test-exch2010-1\c$\temp /y

作为运行命令,我设置如下:

Start external command: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Command line arguments: -NoExit -Command "Import-Module C:\Temp\ExchMgmt.dll"

当我运行项目时,Powershell使用适当的命令在目标服务器上运行。但是当我运行cmdlet时,根本没有断点。

如果我以相同的方式构建项目,然后手动在目标服务器上运行Powershell,导入模块然后将VS2012附加到powershell.exe进程,则成功命中所有断点。虽然有时会发生同样的问题

Exch2010服务器在域中,VS2012计算机不在。我使用域中唯一的帐户进行连接,这是一切的管理员:-)此外,我已经明确许可此用户调试SecPol中的程序。

另外我试图调试这个项目是VS2010。在那里,我收到一条消息:“以下模块是在启用优化或没有调试信息的情况下构建的”。 我仔细检查了项目设置:
   - 禁用优化代码
   - 调试信息已满    - 生成PDB文件

我深入研究了类似的主题,发现禁用Just My Code设置会有所帮助。我尝试了这个,但在我的情况下没有帮助

我注意到System.Data.dll具有不同平台目标的警告(我使用x64。这可能是一个原因)。由于我没有使用这个程序集,我从引用列表中删除了它。之后,我注意到在运行项目时没有任何变化。但是当我将调试器附加到远程计算机上运行的powershell.exe进程并加载了我的模块时,我看到调试日志说明如下:

'powershell.exe' (CLR v2.0.50727: DefaultDomain): Loaded 'C:\temp\ExchMgmt.dll'. Cannot find or open the PDB file.

但是我确保将DLL和PDB文件都复制到远程计算机。 我检查了加载的模块(Debug - > Windows - > Modules),发现我的模块没有加载调试符号。当我打开符号加载信息窗口时,我发现了以下条目:

d:\Projects\ExchMgmt\ExchMgmt\obj\x64\Debug\ExchMgmt.pdb: PDB does not match image.

我检查过powershell.exe进程是x64。但我也注意到它说CLR是2.0.50727。不确定它是否正确,因为我的模块的目标框架是3.5

1 个答案:

答案 0 :(得分:0)

我提出了一个解决方案here

  • 在C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \目录
  • 中创建powershell.exe.config文件next powerset.exe
  • 假设已经不存在,请将内容设置为 <?xml version ="1.0"?> <configuration> <startup> <supportedRuntime version="v2.0.50727" /> <!-- where 2.0.50727 is the version I read above, tweak if necessary --> </startup> </configuration>

我设置了第一个版本3.5,我希望它与构建的程序集匹配。但是后来我在VS2012中遇到错误,powershell.exe平台比VS2012运行的新版本更新。所以我把它设置为2.0.50727,现在它工作正常: - )