我有一个看起来像这样的课程:
public class MyService
{
private MyService(){}
public static string GetStuff()
{
var stuffDid = new MyService();
return stuffDid.DoStuff();
}
private string DoStuff()
{
//do stuff
}
//other private helpers
}
显然我离开了很多,但这就是一般的外壳。
现在,我有一个单元测试:
[Test]
public void MyTest()
{
var results = MyService.GetStuff();
}
我在单元测试中设置了断点,我可以看到results
有数据。但是,我在整个MyService
的字面上设置了断点,除非我把它们放在大括号上,否则什么都不会被击中。由于results
有数据,我无法理解,return
中的MyService
语句会受到影响,对吗?
我错过了什么吗?我完全忘记了最基本的规则吗? MyService
怎么没有被击中?如果我用F11
手动插入它,它只是跳来跳去,甚至没有像我期望的那样通过每一行。此外,当我通过手动步进时,我倾向于在我应该最初击中它之后击中某些代码。并且任何switch
语句似乎都默认为第一个选项,即使切换的值应该明确输入不同的case
。
我甚至尝试过制作MyService
构造函数public
并取消所有static
方法,但它仍无效。
编辑:
我的测试和'核心'代码在同一个解决方案中,但不同的项目(分别为Test
和Core
)。其他测试在Core
中遇到断点没有问题,只有在特定测试(测试MyService
的唯一测试)时才会出现这个问题。
编辑2:
我删除了我的PDB文件并清理了解决方案。仍然没有。
答案 0 :(得分:61)
一些想法。
Debugger.Break()
而不是断点
在VS 您是否一直在调整计算机上的日期?这真的搞砸了构建过程。如果是这样,请手动删除所有obj / bin文件夹并重新编译。
答案 1 :(得分:11)
可能因为您只调试了1个项目而不是Test
和Core
您可以将VS设置为一次调试多个项目,您可以通过right-click your solution > Properties > Common Properties > StartUp Project
您可以在这里设置"多个启动项目"
只需设置Core
和Test
即可。这可以解决您的问题。
答案 2 :(得分:9)
答案 3 :(得分:5)
我有一个非常具体的场景,导致明显的问题是“断点没有被击中”。
由于此处没有其他答案提到它,我将添加我的机会,它将帮助有同样问题的人。
在我的情况下,解决方案很愚蠢,并且使用尽可能多的LINQ,我应该尽早解决这个问题。当运行返回IEnumerable的方法时,其中包含的返回语句实际上是yield return
语句,那么在调用它时将不会执行该方法。
当您从该IEnumerable对象调用另一个方法时,实际上会执行它,例如ToList()
或Count()
。只有然后才能执行该方法并达到断点。
答案 4 :(得分:3)
请确保使用调试器符号构建程序集。
此选项必须填写“完整”:
右键单击包含代码文件的项目,其中的断点不会被命中。选择“属性”。
打开项目属性后,选择“构建”选项卡。注意“高级...” - 标签页底部的Buttom。 (在“输出” - 组“)中
单击此按钮并为“调试信息”属性选择“完整”。这应该是断点没有被击中的原因。 Visual Studio使用保存在pdb文件中的符号来查找断点的确切位置。如果未创建这些文件,则不会触发任何断点。也许你禁用了这些文件的创建,以便整理你的项目文件结构。这是我认识到需要这些文件的情况。
答案 5 :(得分:3)
我最近遇到了同样的问题,把头撞在了墙上。
答案结果非常愚蠢:不知怎的,我的测试项目与主库项目不同步。我正在构建测试和库的调试版本,但测试项目从bin/Release
文件夹复制了库。我只是重新创建了项目参考,一切都已修复。
P.S。它甚至更加危险:调试器进入了库函数,但不知何故在它的中间跳过了一行。
答案 6 :(得分:1)
我在25个项目中发生了这种情况,这些项目都在同一个解决方案中。其他项目表达了断点,但这一点并没有。我从解决方案中删除了项目(删除,而不是卸载),这打破了对它的所有引用,然后将其添加回解决方案,并且工作正常!
如果这不起作用,您可能需要从头开始重新创建问题项目并将该新项目添加到解决方案中。
我为什么与纯粹的运气分道扬铛的最佳解释是,我们多年来多次将项目从一个版本的VS迁移到另一个版本,并且可能其中一个迁移导致了这个问题。
答案 7 :(得分:1)
您需要将DoStuff设为静态。
private static string DoStuff()
{
//do stuff
}
答案 8 :(得分:1)
清理解决方案并重建并执行启动项目。
请您快速浏览一下BUILD> Configuration Manager,只是为了确定设置了哪些配置属性。如果是开发,那么您可能需要调整项目属性 - >点击提前设置 - >在[输出选项卡]中将调试信息更改为“完整”。
即使不是开发模式,您也可以按照第二步进行操作
答案 9 :(得分:1)
这听起来好像pdb文件未在测试沙箱中更新。
1)确保您处于调试模式。
2)您是否可以尝试显式包含pdb文件的部署项目?
3)如果1和2失败,我发现有时visual studio需要重启:)
答案 10 :(得分:1)
您的代码表示“服务”,可以作为单独的进程运行。如果是这种情况,您可以加载程序集,因此断点将是纯红色圆圈,但在另一个进程中运行的程序集的另一个副本实际上正在处理请求。
答案 11 :(得分:0)
VS使用.pdb文件完全按照你描述的方式运行(没有点击断点,点击你不希望在单步执行时遇到的代码),而使用的源代码生成的.pdb文件与代码不同用于调试。我不能保证这是你的情况,但是当我需要进入代码时,我已经多次观察到这种行为,该代码是作为预先构建的库提供的,该库是针对具有相同文件名的旧/不同代码生成的/符号。
答案 12 :(得分:0)
也许您的Test
项目引用了较旧的Core
二进制文件,而不是Core
(源代码)项目?
尝试在Test项目中重新添加引用:
转到Test
项目并删除对Core
项目的引用。
现在选择References文件夹并右键单击它,然后选择菜单选项以添加新引用。在“参考管理器”对话框中,确保选择Solution
,然后选择左侧的Projects
。然后在“参考管理器”对话框的中间,选择(选中)Core
项目。
再次尝试调试,看看是否有帮助。
答案 13 :(得分:0)
要尝试的更多内容:
检查加载的符号是否与调试的可执行文件匹配:
打开VS命令提示符并cd到您调试的可执行文件所在的目录。
然后执行dumpbin /PDBPATH:VERBOSE MyServiceExecutable.exe
并扫描输出“PDB年龄不匹配”(参考:http://msdn.microsoft.com/en-us/library/44wx0fef.aspx)
不确定VS 2012,但是旧版本的VS有一个错误的源文件显示错误,前提是您的项目中有两个源文件具有相同的源文件 名称,即使它们位于不同的文件夹中。因此,如果您的项目包含另一个具有相同名称的源文件,请查看是否重命名其中一个文件有帮助。 (更新:似乎VS 2012 is affected too。)
答案 14 :(得分:0)
我遇到了类似的问题。事实证明,对我而言,使用*.testrunconfig
文件从VS2010到VS2012的迁移很糟糕。我删除了旧的并设置了一个新问题来解决问题。
答案 15 :(得分:0)
据我所知,Visual Studio没有明确的调试服务方法,特别是Windows服务。尝试添加一些代码到GetStuff打印到文本文件,这样你至少知道代码被击中。在创建服务时,我经常会依赖这种方法进行测试。
答案 16 :(得分:0)
如果处于释放模式,请将其切换到调试模式。
答案 17 :(得分:0)
愚蠢的我测试项目还没有建成:
答案 18 :(得分:0)
您可以尝试在Thread.Sleep(5000)
方法中添加GetStuff
并使用附加到处理
Visual Studio>工具>附加到流程,看看该行下面的断点是否被击中。
答案 19 :(得分:0)
这个很晦涩:
确保没有两个虚拟目录,其中不同的应用程序池指向硬盘上的相同物理位置。在开发过程中,这有时会发生在测试中,或者是错误的。
我不是100%清楚技术细节但是我有两个AppPools和两个虚拟目录并且没有断点被击中因为我认为物理路径以某种方式在IIS / Visual Studio中映射到另一个apppool而不是一个那实际上正在执行。
答案 20 :(得分:0)
我有同样的问题。也许我的解决方案可以帮助您解决问题。只需在“附加到进程”选项“附加到”选择值“Avtomatic:Native code”。最好的问候。
答案 21 :(得分:0)
首先尝试通过鼠标右键单击项目来重建项目>重建如果这不起作用,请尝试清理项目(右键单击项目>清理)
如果这不起作用,请检查:
Right mouse click your project
select [Properties]
select the [Build] tab
make sure [Define DEBUG constant] and [Define TRACE constant] are checked
Click the [Advanced] button at the bottom of the Build tabpage
Make sure that [Debug Info:] is set to [full]
Click [OK] and rebuild the project ;-)
希望对你有用! (步骤6生成.pdb文件,这些是调试符号)
答案 22 :(得分:0)
要逐步调试,您必须做两件事。首先,您必须设置断点,然后必须将调试器附加到运行代码的进程。如果您运行的是IIS Express并且有64位计算机,则需要附加运行代码的 iisexpress.exe 。如果按CTRL + ALT + P,您将进入附加到流程窗口。附加后,如果代码匹配,则应该触发断点。
答案 23 :(得分:0)
在单元测试中,我没有遇到断点,并意识到我正在运行测试而不是调试测试。在测试资源管理器的顶部是选项“全部运行”,“运行失败”,“运行通过”等。当您运行测试时,不会触发断点。要调试测试,请在Test Explorer中右键单击测试或测试组,然后选择Debug Selected Tests。