Javascript 如果字符串包含某个子字符串,则在任何字符串赋值上设置断点

Javascript 如果字符串包含某个子字符串,则在任何字符串赋值上设置断点,javascript,debugging,breakpoints,Javascript,Debugging,Breakpoints,我是否可以设置一个数据断点,如果将任何变量分配给包含某个子字符串的字符串,该断点将触发 例如,我想对包含&ctoken=的URL的构造方式进行反向工程。它是用复杂的JavaScript完成的,目标是混淆它 如果我可以告诉JSVM监视所有字符串变量,并在任何变量上出现某个子字符串时中断,这将对我有很大帮助 这可能吗 您可以在右侧的浏览器devTools中使用条件断点 用菜单单击 如果您可以在页面的某个地方编写js,那么 可以这样做: 在我开始之前——据我所知,这是不可能的 您需要的(甚至在创建调

我是否可以设置一个数据断点,如果将任何变量分配给包含某个子字符串的字符串,该断点将触发

例如,我想对包含
&ctoken=
的URL的构造方式进行反向工程。它是用复杂的JavaScript完成的,目标是混淆它

如果我可以告诉JSVM监视所有字符串变量,并在任何变量上出现某个子字符串时中断,这将对我有很大帮助

这可能吗

  • 您可以在右侧的浏览器devTools中使用条件断点 用菜单单击
  • 如果您可以在页面的某个地方编写js,那么 可以这样做:

  • 在我开始之前——据我所知,这是不可能的

    您需要的(甚至在创建调试功能之前)是原始字符串类型,这些类型已经装箱到本机内置对象
    string
    ,然后已经代理

    还有一些解释:

    只有

    const s = "hi"
    
    还不是
    String
    (ECMAScript实现为您的作用域提供的内置本机对象)的实例,而是原始类型。 这种原始类型只不过是指向原始数据内存引用的指针。我甚至假设有内置的池(如Java中的池)来优化以下情况:

    const s = "hi"
    const x = new String("hi")
    
    与数据对象的内存引用相同。但是后者当然会被
    String
    装箱。

    在原始类型上,即使我们想添加订阅者,也无法添加订阅者

    例如:

    s.charAt(i)
    
    将自动装箱
    s
    添加到其包装
    字符串中

    观察每一种原始类型意味着我们必须将所有原始字符串框到
    String
    ,这对性能根本不是一件好事

    不仅如此,
    String
    本身的实现也必须允许我们添加订阅者,因此已经被代理了

    在JS中,这样的代理看起来是这样的(为了更容易理解我所说的代理的意思):


    我想这对性能也不好。

    我理解技术要求。您还可以编写业务需求。根据您的IDE,您可以设置条件断点,仅当满足某个条件时才会导致代码停止执行。在您的情况下,您可以按照以下方式进行操作:
    myString.search(“&ctoken=”)!=-1
    据我所知,您希望创建
    全局条件断点
    ,但不幸的是,这是不可能的@ThomasCook是的,只是需要注意,它应该适用于任何字符串变量,而不仅仅适用于具有特定名称的特定变量。也就是说,条件是“如果在任何执行点,任何变量都持有包含某个子字符串的字符串,则中断执行”。部分解决方案可以重写che string构造函数方法并在其上设置断点。这不能用于赋值
    var str=“Hello”
    ,但可用于
    var str=new String(“Hello”)
    
    s.charAt(i)
    
    var proxiedString = new Proxy(String, {
      defineProperty(target, propKey, propDesc) {
        console.log('defined a new string')
      },
      set(obj, prop, value) {
        console.log('set a new value to a string')
      }
    });
    
    proxiedString.x = 'newPropValue'