gdbinit 4.55 KB
Newer Older
1 2 3 4
# Copyright 2014 the V8 project authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

5
# Print tagged object.
6
define job
7
call _v8_internal_Print_Object((void*)($arg0))
8 9 10 11 12 13
end
document job
Print a v8 JavaScript object
Usage: job tagged_ptr
end

14 15 16 17 18 19 20 21 22 23
# Print content of v8::internal::Handle.
define jh
call _v8_internal_Print_Object(*((v8::internal::Object**)($arg0).location_))
end
document jh
Print content of a v8::internal::Handle
Usage: jh internal_handle
end

# Print content of v8::Local handle.
24
define jlh
Yang Guo's avatar
Yang Guo committed
25
call _v8_internal_Print_Object(*((v8::internal::Object**)($arg0).val_))
26 27 28 29 30 31
end
document jlh
Print content of a v8::Local handle
Usage: jlh local_handle
end

32 33
# Print Code objects containing given PC.
define jco
34
call _v8_internal_Print_Code((void*)($arg0))
35 36 37 38 39 40
end
document jco
Print a v8 Code object from an internal code address
Usage: jco pc
end

41 42 43 44 45 46 47 48 49
# Print LayoutDescriptor.
define jld
call _v8_internal_Print_LayoutDescriptor((void*)($arg0))
end
document jld
Print a v8 LayoutDescriptor object
Usage: jld tagged_ptr
end

50 51 52 53 54 55 56 57 58
# Print TransitionTree.
define jtt
call _v8_internal_Print_TransitionTree((void*)($arg0))
end
document jtt
Print the complete transition tree of the given v8 Map.
Usage: jtt tagged_ptr
end

59
# Print JavaScript stack trace.
60
define jst
61
call _v8_internal_Print_StackTrace()
62 63 64 65 66 67
end
document jst
Print the current JavaScript stack trace
Usage: jst
end

68 69 70 71 72 73 74 75 76 77 78 79
# Skip the JavaScript stack.
define jss
set $js_entry_sp=v8::internal::Isolate::Current()->thread_local_top()->js_entry_sp_
set $rbp=*(void**)$js_entry_sp
set $rsp=$js_entry_sp + 2*sizeof(void*)
set $pc=*(void**)($js_entry_sp+sizeof(void*))
end
document jss
Skip the jitted stack on x64 to where we entered JS last.
Usage: jss
end

80 81 82 83
# Print stack trace with assertion scopes.
define bta
python
import re
84
frame_re = re.compile("^#(\d+)\s*(?:0x[a-f\d]+ in )?(.+) \(.+ at (.+)")
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
assert_re = re.compile("^\s*(\S+) = .+<v8::internal::Per\w+AssertType::(\w+)_ASSERT, (false|true)>")
btl = gdb.execute("backtrace full", to_string = True).splitlines()
for l in btl:
  match = frame_re.match(l)
  if match:
    print("[%-2s] %-60s %-40s" % (match.group(1), match.group(2), match.group(3)))
  match = assert_re.match(l)
  if match:
    if match.group(3) == "false":
      prefix = "Disallow"
      color = "\033[91m"
    else:
      prefix = "Allow"
      color = "\033[92m"
    print("%s -> %s %s (%s)\033[0m" % (color, prefix, match.group(2), match.group(1)))
end
101
end
102 103 104 105 106
document bta
Print stack trace with assertion scopes
Usage: bta
end

107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
# Search for a pointer inside all valid pages.
define space_find
  set $space = $arg0
  set $current_page = $space->anchor()->next_page()
  while ($current_page != $space->anchor())
    printf "#   Searching in %p - %p\n", $current_page->area_start(), $current_page->area_end()-1
    find $current_page->area_start(), $current_page->area_end()-1, $arg1
    set $current_page = $current_page->next_page()
  end
end

define heap_find
  set $heap = v8::internal::Isolate::Current()->heap()
  printf "# Searching for %p in old_space  ===============================\n", $arg0
  space_find $heap->old_space() ($arg0)
  printf "# Searching for %p in map_space  ===============================\n", $arg0
  space_find $heap->map_space() $arg0
  printf "# Searching for %p in code_space ===============================\n", $arg0
  space_find $heap->code_space() $arg0
end
document heap_find
Find the location of a given address in V8 pages.
Usage: heap_find address
end

132
set disassembly-flavor intel
133
set disable-randomization off
134 135 136 137 138 139

# Install a handler whenever the debugger stops due to a signal. It walks up the
# stack looking for V8_Dcheck and moves the frame to the one above it so it's
# immediately at the line of code that triggered the DCHECK.
python
def dcheck_stop_handler(event):
140
  frame = gdb.selected_frame()
141
  select_frame = None
142
  message = None
143 144 145 146 147
  count = 0
  # limit stack scanning since they're usually shallow and otherwise stack
  # overflows can be very slow.
  while frame is not None and count < 5:
    count += 1
148 149 150 151 152 153
    if frame.name() == 'V8_Dcheck':
      frame_message = gdb.lookup_symbol('message', frame.block())[0]
      if frame_message:
        message = frame_message.value(frame).string()
      select_frame = frame.older()
      break
154
    if frame.name() is not None and frame.name().startswith('V8_Fatal'):
155 156 157
      select_frame = frame.older()
    frame = frame.older()

158 159 160
  if select_frame is not None:
    select_frame.select()
    gdb.execute('frame')
161 162
    if message:
      print('DCHECK error: {}'.format(message))
163

164 165
gdb.events.stop.connect(dcheck_stop_handler)
end