我现在正在学习v8,但我遇到了一些问题。如果我想调试一个方法的C++实现,如何在内存中设置一个断点一个方法的起始地址。例如,var a= new Array(0,1); a.indexOf(1) ;我想在slice的开头设置一个断点,或者有其他方法来跟踪汇编程序代码吗?
有许多函数将被编译并写入一个名为snapshot.bin的文件中。所以我不能在这些函数的开头设置断点。
发布于 2017-09-01 14:30:08
您需要检查源代码并找到slice的实现。然后在该.cc文件中设置gdb/lldb断点:byiltins-typedarray.cc
许多函数被定义为内置函数或运行时函数。
发布于 2017-09-02 07:37:49
这取决于您想要检查的函数的类型。
您可以在不使用快照的情况下进行编译,以避免与快照相关的调试困难(代价是使启动变得更慢:在Debug模式下运行几秒钟)。
您可以修改相应的代码生成器,以便在函数开始时发出break指令。以Array.indexOf为例,这可能是最简单的解决方案;CodeStubAssembler指令称为DebugBreak()。
您可以使用GDB在其他地方中断,找到相关函数的方法(例如,通过isolate->builtins),并在其条目的地址上设置断点。(这需要一些V8知识和/或代码阅读技能,但这并不困难。)
您可以使用各种--print-*-code标志将代码打印到标准输出(而不会中断它)。
https://stackoverflow.com/questions/45991936
复制相似问题