如何在V8中调试javascript实现

时间:2017-09-01 00:50:28

标签: javascript debugging v8

我现在正在学习v8,但我遇到了一些问题。 如果我想调试方法的C ++实现,如何在内存中设置断点作为方法的起始地址。 例如var a= new Array(0,1); a.indexOf(1) ;我想在切片的开头设置一个断点,还是有其他方法来跟踪汇编代码?

有许多函数将被编译并写入名为snapshot.bin的文件中。所以我不能在这些函数的开头设置一个断点。

2 个答案:

答案 0 :(得分:0)

您需要检查源代码并找到slice的实现。然后在该.cc文件中设置gdb / lldb断点:byiltins-typedarray.cc

许多函数被定义为内置函数或运行时函数。

答案 1 :(得分:0)

这取决于您要检查的功能类型。

您可以在没有快照的情况下进行编译,以解决与快照相关的调试问题(以降低启动速度为代价:在调试模式下几秒钟)。

您可以修改相应的代码生成器,以在函数开头发出中断指令。对于Array.indexOf的例子,这可能是最简单的解决方案; CodeStubAssembler指令称为DebugBreak()

你可以使用GDB打破其他地方,找到你所讨论的函数的方式(例如通过isolate-> builtins),并在其条目的地址上设置断点。 (这需要一些V8知识和/或代码阅读技巧,但这并不困难。)

您可以使用各种--print-*-code标志将代码打印到标准输出(不打破它)。