我现在正在学习v8,但我遇到了一些问题。
如果我想调试方法的C ++实现,如何在内存中设置断点作为方法的起始地址。
例如var a= new Array(0,1); a.indexOf(1) ;
我想在切片的开头设置一个断点,还是有其他方法来跟踪汇编代码?
有许多函数将被编译并写入名为snapshot.bin的文件中。所以我不能在这些函数的开头设置一个断点。
答案 0 :(得分:0)
您需要检查源代码并找到slice
的实现。然后在该.cc文件中设置gdb / lldb断点:byiltins-typedarray.cc
许多函数被定义为内置函数或运行时函数。
答案 1 :(得分:0)
这取决于您要检查的功能类型。
您可以在没有快照的情况下进行编译,以解决与快照相关的调试问题(以降低启动速度为代价:在调试模式下几秒钟)。
您可以修改相应的代码生成器,以在函数开头发出中断指令。对于Array.indexOf的例子,这可能是最简单的解决方案; CodeStubAssembler
指令称为DebugBreak()
。
你可以使用GDB打破其他地方,找到你所讨论的函数的方式(例如通过isolate-> builtins),并在其条目的地址上设置断点。 (这需要一些V8知识和/或代码阅读技巧,但这并不困难。)
您可以使用各种--print-*-code
标志将代码打印到标准输出(不打破它)。