That sounds like a scenario that shouldn't need any modification of V8 
itself, since JavaScript gives you a lot of control to override how 
properties behave. Here's a (not very well-tested, and probably with bugs) 
function to enable logging of a particular property:

function enableLogging(obj, name) {
  var descriptor = Object.getOwnPropertyDescriptor(obj, name);
  if (!descriptor) {
    // Prop isn't on that object, maybe a prototype?
    obj = Object.getPrototypeOf(obj);
    if (!obj) {
      throw new Error("can't find property");
    }
    return enableLogging(obj, name);
  }
  if (!descriptor.configurable) {
    throw new Error("can't reconfigure property");
  }
  if (descriptor.get) {
    var originalGet = descriptor.get;
    descriptor.get = function () {
      var result = originalGet.apply(this, arguments);
      console.log("got " + name, result);
      return result;
    };
  }
  if (descriptor.set) {
    var originalSet = descriptor.set;
    descriptor.set = function (v) {
      console.log("setting " + name, v);
      return originalSet.apply(this, arguments);
    };
  }
  if (descriptor.value) {
    var value = descriptor.value;
    delete descriptor.value;
    descriptor.get = function () {
      console.log("got " + name, value);
      return value;
    };
    if (descriptor.writable) {
      delete descriptor.writable;
      descriptor.set = function (v) {
        console.log("setting " + name, v);
        value = v;
      };
    }
  }
  Object.defineProperty(obj, name, descriptor);
}

Then you just call it like enableLogging(document, "cookie") for whichever 
properties are of interest, and it will print to the developer console. I 
guess there might be a further step if you need this to automatically write 
to a file or something; maybe then you'd need to replace console.log with 
some custom function.

On Wednesday, April 15, 2020 at 10:17:57 AM UTC-7, jun5...@gmail.com wrote:
>
> Hi Jakob,
>
> Thanks for your answer.
>
> Regarding logging properties:
> What if capturing a few targeted functions and properties only? I have a 
> list of them (~30 built-in JS APIs or properties), including window.name, 
> document.cookie, localStorage.setItem(), etc.
> Will this make life easier? If yes, should I still follow the same 
> direction as you suggested?
>
> Regarding logging functions:
> I've been trying to use the following code (get from this link 
> <https://stackoverflow.com/questions/25666539/v8-cant-get-calling-function-name-in-a-functioncallback>
>  
> at StackOverflow 
> <https://stackoverflow.com/questions/25666539/v8-cant-get-calling-function-name-in-a-functioncallback>
> ):
> global->Set(v8::String::NewFromUtf8(isolate, "eval"), 
> v8::FunctionTemplate::New(isolate, *MY_LOGGING_FUNCTION*));
> Unfortunately, I didn't make this work. By any chance do you know the 
> right place to put this code in order to trigger *MY_LOGGING_FUNCTION.*
>
> BTW, while searching before I post this topic, I notice you answered lots 
> of questions in the group. Just want to say thanks again. 
>
>
>
>
>
>
> On Wednesday, April 15, 2020 at 4:53:46 AM UTC-7, Jakob Kummerow wrote:
>>
>> The first part of this is easy: the existing --trace flag traces all 
>> function calls. If printing to stdout is not what you need, you can at 
>> least grep for FLAG_trace in the code to see where you'd have to add 
>> your own code.
>>
>> The second part, logging all accessed properties, seems considerably 
>> harder -- I'm not sure how to do it. As a start, you can turn off ICs, and 
>> add code to the RUNTIME_FUNCTIONs you see in ic.cc. But that leaves a 
>> bunch of implicit property loads inside built-in functions, and those don't 
>> go through any common bottlenecks, so you'd have to find them all by hand. 
>> It's going to be a lot of work.
>>
>> On Wed, Apr 15, 2020 at 9:20 AM <jun5...@gmail.com> wrote:
>>
>>> Hello, 
>>>
>>> For research reason, I need to log all the function names and properties 
>>> accessed from javascript. Given the below example code from a webpage:
>>>
>>> <script>
>>>       console.log('test");
>>>       window.name="new name";
>>> </script>
>>>
>>> I'd like to capture that 'console.log()' and 'window.name' have been 
>>> accessed.
>>>
>>>
>>> I'm quite new to v8 development. I've been struggling with the v8 source 
>>> code in the chromium for a while. 
>>> Could anyone save my life by giving me some hints or code snippets to 
>>> get started?
>>>
>>>

-- 
-- 
v8-dev mailing list
v8-dev@googlegroups.com
http://groups.google.com/group/v8-dev
--- 
You received this message because you are subscribed to the Google Groups 
"v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/v8-dev/cddfe2a9-91e1-4cb4-a060-c08cd7b4e1d3%40googlegroups.com.

Reply via email to