| OLD | NEW |
| (Empty) |
| 1 # Prerequisites | |
| 2 | |
| 3 * V8 3.0.9 or newer | |
| 4 * GDB 7.0 or newer | |
| 5 * Linux OS | |
| 6 * CPU with Intel-compatible architecture (ia32 or x64) | |
| 7 | |
| 8 # Introduction | |
| 9 | |
| 10 GDB JIT interface integration allows V8 to provide GDB with the symbol and debug
ging information for a native code emitted in runtime. | |
| 11 | |
| 12 When GDB JIT interface is disabled a typical backtrace in GDB will contain frame
s marked with ??. This frames correspond to dynamically generated code: | |
| 13 | |
| 14 ``` | |
| 15 #8 0x08281674 in v8::internal::Runtime_SetProperty (args=...) at src/runtime.cc
:3758 | |
| 16 #9 0xf5cae28e in ?? () | |
| 17 #10 0xf5cc3a0a in ?? () | |
| 18 #11 0xf5cc38f4 in ?? () | |
| 19 #12 0xf5cbef19 in ?? () | |
| 20 #13 0xf5cb09a2 in ?? () | |
| 21 #14 0x0809e0a5 in v8::internal::Invoke (construct=false, func=..., receiver=...,
argc=0, args=0x0, | |
| 22 has_pending_exception=0xffffd46f) at src/execution.cc:97 | |
| 23 ``` | |
| 24 | |
| 25 However enabling GDB JIT integration allows GDB to produce more informative stac
k trace: | |
| 26 | |
| 27 ``` | |
| 28 #6 0x082857fc in v8::internal::Runtime_SetProperty (args=...) at src/runtime.cc
:3758 | |
| 29 #7 0xf5cae28e in ?? () | |
| 30 #8 0xf5cc3a0a in loop () at test.js:6 | |
| 31 #9 0xf5cc38f4 in test.js () at test.js:13 | |
| 32 #10 0xf5cbef19 in ?? () | |
| 33 #11 0xf5cb09a2 in ?? () | |
| 34 #12 0x0809e1f9 in v8::internal::Invoke (construct=false, func=..., receiver=...,
argc=0, args=0x0, | |
| 35 has_pending_exception=0xffffd44f) at src/execution.cc:97 | |
| 36 ``` | |
| 37 | |
| 38 Frames still unknown to GDB correspond to native code without source information
. See [GDBJITInterface#KnownLimitations](GDBJITInterface#KnownLimitations.md) fo
r more details. | |
| 39 | |
| 40 GDB JIT interface is specified in the GDB documentation: http://sourceware.org/g
db/current/onlinedocs/gdb/JIT-Interface.html | |
| 41 | |
| 42 # Enabling GDB JIT integration | |
| 43 | |
| 44 GDBJIT currently is by default excluded from the compilation and disabled in run
time. To enable it: | |
| 45 | |
| 46 1. Build V8 library with `ENABLE_GDB_JIT_INTERFACE` defined. If you are using
scons to build V8 run it with `gdbjit=on`. | |
| 47 1. Pass `--gdbjit` flag when starting V8. | |
| 48 | |
| 49 To check that you have enabled GDB JIT integration correctly try setting breakpo
int on `__jit_debug_register_code`. This function will be invoked to notify GDB
about new code objects. | |
| 50 | |
| 51 # Known Limitations | |
| 52 | |
| 53 * GDB side of JIT Interface currently (as of GDB 7.2) does not handle registra
tion of code objects very effectively. Each next registration takes more time: w
ith 500 registered objects each next registration takes more than 50ms, with 100
0 registered code objects - more than 300 ms. This problem was reported to GDB d
evelopers (http://sourceware.org/ml/gdb/2011-01/msg00002.html) but currently the
re is no solution available. To reduce pressure on GDB current implementation of
GDB JIT integration operates in two modes: _default_ and _full_ (enabled by `--
gdbjit-full` flag). In _default_ mode V8 notifies GDB only about code objects th
at have source information attached (this usually includes all user scripts). In
_full_ - about all generated code objects (stubs, ICs, trampolines). | |
| 54 | |
| 55 * On x64 GDB is unable to properly unwind stack without `.eh_frame` section (I
ssue 1053 (on Google Code)) | |
| 56 | |
| 57 * GDB is not notified about code deserialized from the snapshot (Issue 1054 (o
n Google Code)) | |
| 58 | |
| 59 * Only Linux OS on Intel-compatible CPUs is supported. For different OSes eith
er a different ELF-header should be generated or a completely different object f
ormat should be used. | |
| 60 | |
| 61 * Enabling GDB JIT interface disables compacting GC. This is done to reduce pr
essure on GDB as unregistering and registering each moved code object will incur
considerable overhead. | |
| 62 | |
| 63 * GDB JIT integration provides only _approximate_ source information. It does
not provide any information about local variables, function's arguments, stack l
ayout etc. It does not enable stepping through JavaScript code or setting breakp
oint on the given line. However one can set a breakpoint on a function by it's n
ame. | |
| OLD | NEW |