- 主题:调试器的困惑
调试器有时候会对被调试的程序产生干扰,破坏了原有的逻辑。
Firebug对RegExp全局对象的干扰是一个例子。
再比如调试器对本地变量或watch内容的属性遍历也会干扰程序。
有些对象,比如XmlHttpRequest对象,它的某些属性对访问时机
是有要求的,比如 responseXML 就要求在 send 方法之后再调用,
但是如果你在调试器里watch它,就使得这些有访问时机要求的属性
被提前访问到。
再比如,我们有这样一个对象,它有属性A和B,是互斥的关系,它的
内部完整状态是延迟确定的,有赖于调用者先使用A属性还是B属性。
调试器面对这样的对象,不管三七二十一都去dump它的属性,就扰乱
了这个对象的逻辑。
也许你会说,你不该这样设计对象。但是如果不考虑调试器因素,它
也没什么问题。所以我觉得这是调试器的困惑。
--
FROM 211.94.73.*
对Firebug我不明白的是它为什么要在程序的作用域范围内执行它自己的正则表达式
它完全可以待在自己的作用域范围内啊,对程序的作用域变量它不也照样可以引用到
吗?
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: 或者,如果調試器能夠徹底的控制虛擬機的話……
: 就每次 watch 當作一個事務回滾吧
: 不過對 firebug 這類是不合适的
: ...................
--
FROM 211.94.73.*
<script>
function fn()
{
var re = /a/g;
var s = "abcabc";
var arr = [];
while (re.exec(s)) {
arr.push(RegExp.input, RegExp.leftContext);
}
alert(arr.join("\n"));
}
</script>
<button onclick="fn()">Test</button>
这个例子不是太简练,但是能演示问题。
在Firefox里打开这个html文件,打开Firebug,在fn()入口处设置断点,
在右边监控里增一个"RegExp",并展开它,单击按钮,开始单步调试,直到
循环结束,看结果。再比较非调试状态的结果。
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: 你帖個例子吧?
--
FROM 211.94.73.*
在单线程模式下又有何不可
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: 來不及細看了,晚上再試……
: 不過直接用帶狀態的全局對象?= =
--
FROM 211.94.73.*
对,这不是个可以“解决”的问题,而是一个让人“认知”的问题
【 在 nullgate (空门·恨只恨我们家鬼害家神) 的大作中提到: 】
: 这是个永恒的问题
--
修改:modico FROM 211.94.73.*
FROM 211.94.73.*