- 主题:调试器的困惑
调试器有时候会对被调试的程序产生干扰,破坏了原有的逻辑。
Firebug对RegExp全局对象的干扰是一个例子。
再比如调试器对本地变量或watch内容的属性遍历也会干扰程序。
有些对象,比如XmlHttpRequest对象,它的某些属性对访问时机
是有要求的,比如 responseXML 就要求在 send 方法之后再调用,
但是如果你在调试器里watch它,就使得这些有访问时机要求的属性
被提前访问到。
再比如,我们有这样一个对象,它有属性A和B,是互斥的关系,它的
内部完整状态是延迟确定的,有赖于调用者先使用A属性还是B属性。
调试器面对这样的对象,不管三七二十一都去dump它的属性,就扰乱
了这个对象的逻辑。
也许你会说,你不该这样设计对象。但是如果不考虑调试器因素,它
也没什么问题。所以我觉得这是调试器的困惑。
--
FROM 211.94.73.*
基本上來説,只要一個方法會改變某個對象的狀態,它就不能被正常 watch....
不管是取屬性的 get 方法還是其它什麽方法都一樣
這個在程序裏我覺得是迴避不了的
而調試器想迴避的話,就只能在每次 watch 之前拷貝整個上下文——
理論上可以做到,但有沒有必要實在是有待商榷
所以現階段不管設計還是使用調試器
性價比最高的做法還是手工迴避吧
【 在 modico ().net() 的大作中提到: 】
: 调试器有时候会对被调试的程序产生干扰,破坏了原有的逻辑。
: Firebug对RegExp全局对象的干扰是一个例子。
: 再比如调试器对本地变量或watch内容的属性遍历也会干扰程序。
: ...................
--
修改:withinsea FROM 123.112.113.243
FROM 123.112.113.243
或者,如果調試器能夠徹底的控制虛擬機的話……
就每次 watch 當作一個事務回滾吧
不過對 firebug 這類是不合适的
除非願意徹底放棄外掛式調試器的優勢
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: 标 题: Re: 调试器的困惑
: 发信站: 水木社区 (Mon Nov 3 12:13:46 2008), 站内
:
: 基本上來説,只要一個方法會改變某個對象的狀態,它就不能被正常 watch....
: 不管是取屬性的 get 方法還是其它什麽方法都一樣
:
: 這個在程序裏我覺得是迴避不了的
: 而調試器想迴避的話,就只能在每次 watch 之前拷貝整個上下文——
: 理論上可以做到,但有沒有必要實在是有待商榷
:
: 所以現階段不管設計還是使用調試器
: 性價比最高的做法還是手工迴避吧
:
: 【 在 modico ().net() 的大作中提到: 】
: : 调试器有时候会对被调试的程序产生干扰,破坏了原有的逻辑。
: : Firebug对RegExp全局对象的干扰是一个例子。
: : 再比如调试器对本地变量或watch内容的属性遍历也会干扰程序。
: : ...................
:
: --
: 在一片喊杀声中,出现在佳花与祥琼面前的是惠侯月溪。
:
: “出列于朝上的大人,只是当众挖鼻孔,就要被处死吗?只因为上朝前没刷牙,或者是吃了大蒜也是死罪。还有上厕所后不洗手,起床后不洗脸,一个星期不洗澡……只要主上不喜欢的事,都是死罪。你们现在的恐惧更本不能和人民所经历的恐惧相提并论。”
:
: 峰王·仲鞑由于精神洁癖而失道,谥号“洌王”。
:
:
: ※ 修改:·withinsea 于 Nov 3 12:14:32 2008 修改本文·[FROM: 123.112.113.243]
: ※ 来源:·水木社区 newsmth.net·[FROM: 123.112.113.243]
--
修改:withinsea FROM 123.112.113.243
FROM 123.112.113.243
对Firebug我不明白的是它为什么要在程序的作用域范围内执行它自己的正则表达式
它完全可以待在自己的作用域范围内啊,对程序的作用域变量它不也照样可以引用到
吗?
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: 或者,如果調試器能夠徹底的控制虛擬機的話……
: 就每次 watch 當作一個事務回滾吧
: 不過對 firebug 這類是不合适的
: ...................
--
FROM 211.94.73.*
你帖個例子吧?
【 在 modico ().net() 的大作中提到: 】
: 对Firebug我不明白的是它为什么要在程序的作用域范围内执行它自己的正则表达式
: 它完全可以待在自己的作用域范围内啊,对程序的作用域变量它不也照样可以引用到
: 吗?
: ...................
--
FROM 123.112.113.243
<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.*
來不及細看了,晚上再試……
不過直接用帶狀態的全局對象?= =
【 在 modico ().net() 的大作中提到: 】
: <script>
: function fn()
: {
: ...................
--
修改:withinsea FROM 123.112.113.243
FROM 123.112.113.243
在单线程模式下又有何不可
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: 來不及細看了,晚上再試……
: 不過直接用帶狀態的全局對象?= =
--
FROM 211.94.73.*
这是个永恒的问题
【 在 modico ().net() 的大作中提到: 】
: 调试器有时候会对被调试的程序产生干扰,破坏了原有的逻辑。
: Firebug对RegExp全局对象的干扰是一个例子。
: 再比如调试器对本地变量或watch内容的属性遍历也会干扰程序。
: ...................
--
FROM 207.46.92.*
对,这不是个可以“解决”的问题,而是一个让人“认知”的问题
【 在 nullgate (空门·恨只恨我们家鬼害家神) 的大作中提到: 】
: 这是个永恒的问题
--
修改:modico FROM 211.94.73.*
FROM 211.94.73.*