调试经典ASP时,调试器在错误的行上工作

11

我在使用任何MS提供的调试环境时,都无法调试我的工作站上的任何ASP Classic网站。我正在使用Win XP SP3,并使用内置的IIS 5.1。

几周前它开始出现,在多个项目中发生。显然,我的环境有所改变,因为过去它运行得很好,即使是最近的IDE只要我附加到进程就可以。然后像下面描述的那样失效了。我已经放弃了,但最近开始了一个新项目,尝试进行调试,它起作用了! 不过今天,它又回到了同样的错误行为:

当我尝试设置断点时,IDE实际上会将点设置在我点击的行的上方或下方几行。我试图在完全是服务器端代码的行上设置断点,所以这不是因为它在HTML嵌入式代码块之前或之后跳过。偶尔它不会设置断点,给我一个空心的断点图标,并呈现一个错误,说该行上没有可执行代码。

当我附加到IIS进程(inetinfo.dll,因为我正在低隔离模式下运行)时,断点可能不会被触发。如果它被触发了,并且我开始单步执行,所选行会跳来跳去,并且不会落在源码中的每一行或按预期跟随控制结构。观察到的变量没有按预期更新。它显然看到了不同于我看到的相同行号的代码。

无论我是在浏览器中加载页面,还是

  • 从VS2010附加到进程,设置断点并刷新页面,或者
  • 设置断点,附加到进程并刷新,或者
  • 在我的源代码中添加一个“停止”语句,并刷新页面。在这种情况下,我会得到一个可用调试器列表,每个调试器都会做完全相同的事情--它们跳过相同的代码行,并遵循相同的“错误”路径。我已经尝试过VS2010、2008、2005、2003和Microsoft Script Debugger。

看起来源代码和调试器正在执行的不同步。我确认在VS > 工具 > 选项 > 调试 > 通用 中设置了“要求源文件与原始版本完全匹配”。

当然,这些都是ASP Classic站点--没有编译的代码,所以我在IDE中看到的源代码应该与调试器执行的代码相同。目前,这不是特定于一个项目--它正在发生在至少两个完全不同的项目上。并且,在多台机器上都发生--我将我的项目部署到测试服务器上并尝试在那里调试,但得到了相同的行为。

我在这里找到了一些类似问题的信息,涉及UTF编码文件包含非ANSI字符(您知道,您使用Unicode支持的那些字符!) here herehere,但我查看了我的源代码,没有发现任何这样的文件。

有什么想法吗?谢谢!

6个回答

9

我曾经看到过这种情况,只有在将项目设置为Release模式而不是Debug模式时才会出现。

检查这个问题的难易程度取决于你的IDE设置,它可能已经存在于你的工具栏中,但如果没有,请按照以下步骤操作:

  1. 右键点击解决方案
  2. 选择“配置管理器”...
  3. 确保在“活动解决方案配置”下拉菜单中选择了Debug

不,我已经检查过了 - 我目前正在工作的项目中只有一个调试配置。而且,再次强调,没有“编译”步骤来调用配置 - 只需保存.ASP文件并刷新浏览器即可。谢谢! - Val
这个问题在其他人的机器上也出现了吗?如果是的话,请检查项目的构建设置,确保它生成了正确的调试信息。我想你已经尝试过重新构建了吧?如果所有这些都不起作用,那么我可能会举起双手,大喊一声,然后重新安装VS。 - knightpfhor
没有需要构建的内容,但我还是进行了重新构建,但没有效果。我会尝试在另一台机器上重现这个问题,这是个好主意!我不认为这只是VS的问题——它发生在所有版本的VS中,以及MS脚本调试器中,因此某些共同的组件正在被调用... - Val

4
在我的情况下,源代码文件中的行末标识符不正确。VS期望的是\x0D\x0A但我只有\x0D。在选项-〉环境-〉文档下,有一个与行尾有关的设置(我不用英语版的VS所以只能猜测)。勾选这个选项可以解决我的问题。

3

在我的文件中,一个注释前多了一个额外的;。不知道为什么会导致问题,但是删除它似乎可以解决问题。


2
今年最被低估的答案,大家+1。有一个80,000多行的.c文件,当设置断点时,程序会跳过数千行。它可以正确地步进逻辑,但从未显示正确的位置。找到这些独立存在的小细节并将其删除解决了问题。 - Sean

2

我在VS2008中遇到了同样的问题。将asp文件转换为ANSI编码(使用Notepad ++)解决了它。


2

编码确实存在问题。该文件原本是ANSI格式,我将其转换为其他格式,然后又转回ANSI格式解决了问题。但请注意,在更改编码时可能会丢失特殊字符。


我想补充一点,还需要检查脚本包含的所有文件的编码方式,这可以通过 <!--#include file = "......"--> 指令实现。 - Vadim Belyaev

1

这在VS2010中仍然发生。

我发现解决方法是选择发布版本而不是调试版本。重新构建项目。切换回调试版本,问题就解决了。

现在你们又同步了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接