It is easy to attach your debugger to the right SharePoint application pool using Visual Studio, especially if specific extensions like CKS.Dev or my VS extension is installed.
Sometimes life is not so trivial, you don’t have Visual Studio installed on the server and / or you should use other tools to debug your application. It would be great to have the right process ID in this case as well.
For example, assume you have to attach WinDbg or other debugging tools like Deblector to the process of the IIS application pool of a selected SharePoint application.
Two years ago I wrote a post about how to attach the VS debugger from a VS macro. In that post I’ve illustrated how to get the right process based on the application pool name (see the GetProcessIdByAppPoolName and GetAppPoolNameFromCommandLine methods in that post). In the post about my VS extension mentioned above you can find a similar solution as well.
In this post I show you two PowerShell methods that can be used when there is no Visual Studio on the computer or you simply do not want to work with that.
You should specify the name of the application pool for the Get-AppPoolProcessIdByName method and it displays the process ID of the matching application pool:
function Get-AppPoolProcessIdByName($name)
{
Get-WmiObject Win32_Process |
Where-Object { $_.CommandLine -like "*w3wp.exe*" } |
ForEach-Object { [regex]::Matches($_.CommandLine, "-ap ""(.+)"" -v") |
Add-Member NoteProperty -Name ProcessId -Value $_.ProcessId -PassThru } |
Where-Object { $_.Success -and $_.Groups.Count -gt 1 -and $_.Groups[1].Value -eq $name } |
ForEach-Object { Write-Host $_.ProcessId }
}
Usage:
Get-AppPoolProcessIdByName("SharePoint – 80")
The Get-SPAppPoolProcessIdByUrl method first determines the corresponding SharePoint web application, then calls the Get-AppPoolProcessIdByName method to get the process ID.
function Get-SPAppPoolProcessIdByUrl($url)
{
$app = Get-SPWebApplication $url
Get-AppPoolProcessIdByName($app.DisplayName)
}
Usage:
Get-SPAppPoolProcessIdByUrl("http://sp2010")
You can use Get-AppPoolProcessIdByName for arbitrary IIS application pool, but as you can see from the code (and as I intended to sign with the Get-SP prefix) the Get-SPAppPoolProcessIdByUrl method is SharePoint specific.