2017-09-01 49 views
2

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

有很多函数会被编译并写入名为snapshot.bin的文件中。所以我不能在这些函数的开始处设置断点。

+0

对不起,写了一个错误的例子/ – cyril

回答

0

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

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

+0

我很抱歉写了一个错误的例子。有很多函数会被编译并写入名为snapshot.bin的文件中。所以我不能在这些函数的开始处设置断点。 – cyril

0

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

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

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

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

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

相关问题