调试 PowerShell cmdlet 时出现问题

发布于 2024-09-11 11:41:24 字数 847 浏览 7 评论 0 原文

我在 Windows 7 64 位专业版上使用 Visual Studio 2010。我在调试自定义 PowerShell cmdlet 时遇到问题。

配置

  • 语言:C#,面向 .NET Framework 3.5 SP1。
  • 平台目标:任何 CPU
  • 启动操作:C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe
  • 命令行参数:-noexit -command Add-PSSnapIn MyCustomSnapIn

问题 1: 按 F5(调试 → 开始调试)时无法附加

  • PowerShell 打开,任务管理器指示 powershell.exe 正在作为 64 位进程运行。图像路径名称列显示在启动操作中指定的相同可执行文件。
  • 如果我在 Visual Studio 中选择“调试”→“全部中断”,我会收到一条消息“无法中断执行。此进程当前未执行您选择调试的代码类型”。

打开时,意外地作为 32 位进程启动

  • 问题 2:当我按 Ctrl+F5(调试 → 启动但不调试) PowerShell 。任务管理器指示 powershell.exe 正在作为 32 位进程运行 - 这次图像路径名称显示 SysWOW64 重定向。

现在令人烦恼的调试方式:我发现调试 cmdlet 的唯一方法是按 F5,然后选择“调试”→“全部分离”,然后选择“调试”→“附加到进程”并重新附加 Visual Studio。

I'm using Visual Studio 2010 on Windows 7 64-bit Professional. I'm having trouble debugging a custom PowerShell cmdlet.

Configuration

  • Language: C#, targeting .NET Framework 3.5 SP1.
  • Platform target: Any CPU
  • Start Action: C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe
  • Command line arguments: -noexit -command Add-PSSnapIn MyCustomSnapIn

Problem 1: Failure to attach when I press F5 (Debug → Start Debugging)

  • PowerShell opens, and Task Manager indicates that powershell.exe is running as a 64-bit process. The Image Path Name column shows the same executable specified in the Start Action.
  • If I choose Debug → Break All in Visual Studio, I receive a message "Unable to break execution. This process is not currently executing the type of code that you selected to debug."

Problem 2: Unexpectedly launches as a 32-bit process when I press Ctrl+F5 (Debug → Start Without Debugging)

  • PowerShell opens. Task Manager indicates that powershell.exe is running as a 32-bit process - this time the Image Path Name shows a SysWOW64 redirection.

The annoying way to debug right now: The only way I've found to debug my cmdlet is to press F5, then select Debug→Detach All, then select Debug→Attach To Process and reattach Visual Studio.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

场罚期间 2024-09-18 11:41:24

问题 1:

在我看来,这就像 VS2010 中报告的一个错误:

使用 VS2008 应该会有所帮助。

更新:
我发现更方便的方式来调试 powershell cmdlet。在解决方案资源管理器中右键单击解决方案节点 ->添加->新项目->选择 powershell.exe 文件 (C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe)。将新添加的项目设置为启动项目(右键单击并选择“设置为启动项目”)。然后转到项目属性(右键单击项目节点并选择“属性”)并将“调试器类型”属性设置为“托管(v2.0、v1.1、v1.0)”。不要忘记注册您的 Provider 或 CmdLet(通过运行构建后事件,请参阅 http://msdn.microsoft.com/en-us/library/ms714644%28v=vs.85%29.aspx)。现在,程序应该在断点处停止。

Problem 1:

Seems to me like a bug in VS2010 reported here:
https://connect.microsoft.com/VisualStudio/feedback/details/539389/debugging-powershell-cmdlet-from-vs-2010-does-not-stop-at-breakpoints?wa=wsignin1.0

Using VS2008 should help.

Update:
I found more convenient way to debug powershell cmdlets. In the solution explorer right click on solution node -> Add -> New project -> Select powershell.exe file (C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe). Set newly added project as start up project (right click and select "Set As Startup Project"). Then go to project properties (right click on project node and select "Properties") and set the "Debugger Type" property to "Managed (v2.0, v1.1, v1.0)". Don't forget to register your Provider or CmdLet (by running post build events, see http://msdn.microsoft.com/en-us/library/ms714644%28v=vs.85%29.aspx). Now, the program should stop at the breakpoint.

半枫 2024-09-18 11:41:24

关于问题 #2,由于 Visual Studio 是在 WOW64 上运行的 32 位进程,因此路径 C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe 被重定向到 C :\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe。这就是 32 位版本的 PowerShell 所在的位置。

On problem #2, since Visual Studio is a 32-bit process running on WOW64, the path C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe is redirected to C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe. Which is where the 32-bit version of PowerShell lives.

小伙你站住 2024-09-18 11:41:24

我知道这篇文章已经发布了大约一年,但无论如何它可能会帮助其他人解决这个问题。

我发现以下场景适用于 PowerShell 2.0。我还在 Windows 7 64 位上使用 VS2010 SP1。

使用 PS 2.0,您不再必须使用 installutil 安装 cmdlet。相反,您可以使用Import-Module(这不需要需要管理员权限)。我不会详细介绍如何完成此操作,因为网络搜索将显示大多数详细信息,但简而言之,您需要在以下位置创建一个文件夹(如果它尚不存在):在

md (Join-Path (Split-Path $profile) modules)

模块文件夹下,创建另一个文件夹与您的 cmdlet DLL 名称相同(减去“.DLL”)。此文件夹将包含您的二进制文件和描述 DLL 的 psd1 文件(请参阅 模块清单)。为了方便起见,我创建了此文件夹作为指向我的项目的 bin\debug 文件夹的文件夹符号链接。

您仍然需要从 Visual Studio 运行 PowerShell(或 PowerShell ISE),如项目属性的“调试”选项卡的“启动操作”部分中其他地方所述。

设置断点并开始。 PowerShell 启动后,键入:

Import-Module <ModuleName>

然后运行 ​​cmdlet。


PowerShell 类型示例

C:\Users\<me>\Documents\WindowsPowerShell\modules\MyCmdlet\MyCmdlet.dll 
C:\Users\<me>\Documents\WindowsPowerShell\modules\MyCmdlet\MyCmdlet.pdb
C:\Users\<me>\Documents\WindowsPowerShell\modules\MyCmdlet\MyCmdlet.psd1
C:\Users\<me>\Documents\WindowsPowerShell\modules\MyCmdlet\MyCmdlet.Types.ps1xml (etc.)

(也可以放入您的个人资料中):

Import-Module MyCmdlet

对我来说,这会命中我的所有断点,并且还会在出现异常时停止。所有这些都无需附加到流程等。

I know that this posting is about a year old at this point, but it may help someone else struggling with this anyway.

I have found that the following scenario works for me with PowerShell 2.0. I am also using VS2010 SP1 on Windows 7 64-bit.

With PS 2.0 you no longer have to install cmdlets using installutil. Instead you can use Import-Module instead (which does not require Admin rights). I will not go into full detail on how that is done as a web search will reveal most details, but in short, you will need to create a folder (if it does not already exist) at:

md (Join-Path (Split-Path $profile) modules)

Under the modules folder, create another folder with the same name as your cmdlet DLL (minus “.DLL”). This folder will contain your binary and a psd1 file that describes your DLL (see Module Manifests). For my convenience I created this folder as a folder symbolic link to my project’s bin\debug folder.

You still need to run PowerShell (or PowerShell ISE) from Visual Studio as describe elsewhere in the “Start Action” section of the Debug tab of your project properties.

Set your breakpoints and go. Once PowerShell starts, type:

Import-Module <ModuleName>

Then run your cmdlet.


Sample

C:\Users\<me>\Documents\WindowsPowerShell\modules\MyCmdlet\MyCmdlet.dll 
C:\Users\<me>\Documents\WindowsPowerShell\modules\MyCmdlet\MyCmdlet.pdb
C:\Users\<me>\Documents\WindowsPowerShell\modules\MyCmdlet\MyCmdlet.psd1
C:\Users\<me>\Documents\WindowsPowerShell\modules\MyCmdlet\MyCmdlet.Types.ps1xml (etc.)

In PowerShell type (can be put in your profile too):

Import-Module MyCmdlet

For me, this hits all my breakpoints and also stops on exceptions. All without having to attach to a process, etc.

聚集的泪 2024-09-18 11:41:24

问题 1:powershell.exe 实际上不是托管可执行文件。它托管 CLR 本身,因此您需要启用本机代码调试以及托管代码才能正常工作。

至于问题2,我不太确定。显然 VS 本身是一个 32 位进程,所以它可能会干扰这里。

Problem 1: powershell.exe is not actually a managed executable. It hosts the CLR itself, so you need to enable native code debugging alongside managed for this to work.

As for problem 2, I'm not sure about this. Obviously VS itself is a 32bit process so perhaps it's interfering here.

神也荒唐 2024-09-18 11:41:24

我能够通过创建文件夹 C:\dev\PowerShell\x64 并复制 C:\Windows\System32\WindowsPowerShell\v1.0 中的所有内容来解决问题 #2进入其中。我创建了一个类似的文件夹 C:\dev\PowerShell\x86。当我指定这些路径时,PowerShell 的预期版本始终会启动,因此开始调试的最短方法现在是“启动而不调试”,然后是“附加到进程”。

I was able to solve problem #2 by creating the folder C:\dev\PowerShell\x64 and copying everything from C:\Windows\System32\WindowsPowerShell\v1.0 into it. I created a similar folder C:\dev\PowerShell\x86. The intended version of PowerShell always launches when I specify these paths, so the shortest way to start debugging is now Start Without Debugging followed by Attach To Process.

不交电费瞎发啥光 2024-09-18 11:41:24

在调用 Add-PSSnapin 以使其在调试会话中可用之前,您没有提及如何安装该插件。

确保您使用 C:\Windows\Microsoft.NET\Framework64\v2.0.50727\InstallUtil.exe 安装插件,而不是 ...\Framework... 中的插件 - 这难倒了我几天。

You don't mention how you're installing the plugin before calling Add-PSSnapin to make it usable in your debugging session.

Make sure that you are installing the plugin using C:\Windows\Microsoft.NET\Framework64\v2.0.50727\InstallUtil.exe, and not the one in ...\Framework... - this stumped me for a couple days.

因为看清所以看轻 2024-09-18 11:41:24

我在使用VS2010时也遇到过这个问题,但安装SP1后就消失了。

I had this problem with VS2010, but it went away after installing SP1.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文