为了调试特定的自定义计时器(已安装并激活(,我尝试了以下步骤:
- 复制了GAC中的
.dll
和.pdb
文件 - 已重新启动计时器服务
- 同时附加了
w3wp
和OWSTimer.exe
进程
但是调试仍然没有进行。放置的调试器是一个空圆圈,显示以下消息:
当前不会命中断点。尚未为此文档加载任何符号。
OWSTimer显示在不同的用户名中。它需要从我的帐户运行吗?
为什么调试不起作用?
调试计时器作业可能很困难。。。你采取的步骤听起来是正确的,但你也可以做更多:
- 计时器作业在OWSTimer.exe中运行-您只需要附加到该作业
- 重新启动计时器服务。为了更好地衡量重新启动、部署、重新启动、
iisreset
;-( - 您是否进行了调试构建或发布构建
- 确保您确实RUN您的计时器作业(如触发器中所示(
如果你的断点仍然没有命中,那就做一些丑陋的事情:在代码中使用Debugger.Launch()
或Debugger.Break()
,或者使用一个总是失败的断言:System.Diagnostics.Trace.Assert(false);
然后是MSDN的救援。
尝试手动加载调试符号,看看它显示了什么:
在中断模式或运行模式下显示模块窗口
在调试菜单上,选择窗口,然后单击模块。
默认情况下,"模块"窗口按加载顺序对模块进行排序。然而您可以选择按任意列排序。
在模块窗口中,您可以看到哪些模块进行了调试已加载符号。此信息显示在"符号状态"列中。如果状态显示Skipped loading Cannot find or open the PDB file,或通过包含/排除设置禁用加载,您可以直接从Microsoft公共符号服务器下载符号的调试器或者从计算机上的符号目录加载符号。了解更多信息有关信息,请参见如何:使用符号服务器和如何:指定符号位置和加载行为。
手动加载符号的步骤
在"模块"窗口中,右键单击符号没有的模块加载。
指向"从中加载符号",然后单击"Microsoft符号服务器"或符号路径。
从MSDN 复制
您也可以尝试删除Visual Studio缓存以确保(从命令提示符(:
del /Q %LOCALAPPDATA%MicrosoftWebsiteCache
del /Q %LOCALAPPDATA%TempVWDWebCache
del /Q %LOCALAPPDATA%MicrosoftTeam Foundation1.0Cache
只是添加到moonthear的帖子中。
在将此代码添加到Execute方法的第一行之前,我也遇到了同样的加载调试符号问题。
public override void Execute(Guid contentDbId)
{
// If in debug mode, trigger a false assertion to give time
// to attach the debugger to the OWSTIMER.EXE process.
#if (DEBUG)
System.Diagnostics.Trace.Assert(false);
#endif
...
检查以确保您的区域设置正确-将/_layouts/15/regionalsetng.aspx
附加到CA URL。如果你的时区不对,你的工作可能会安排在过去的某个时间。这已经不止一次挂断了我的电话。如果是这种情况,请设置正确的时区(使用上面的url(,停止并启动计时器服务(服务工具或打开命令行-net stop sptimerv4
,然后打开net start sptimerv4
(。然后连接到OWSTIMER并进行调试。
- 在「开始」菜单上,指向"管理工具",然后单击"服务">
- 在"服务"窗口中,确保SharePoint 2010计时器服务已启动
- 打开包含计时器作业的Visual Studio 2010项目
- 在作业定义类的Execute方法中设置断点
- 在"调试"菜单上,单击"附加到进程">
- 在"附加到进程"对话框中,c
- 如果显示"附加安全警告"对话框,请单击"附加">
- 在SharePoint管理中心网站中,单击"监视",然后单击"查看作业定义">
- 单击作业的名称,然后单击"编辑计时器作业"页面上的"立即运行">
- 请验证Visual Studio 2010调试器是否停止在您的断点上执行。请单击OWSTIMER.EXE,然后单击"附加">