517ab73fd7
This change begins to implement the functionality described in https://docs.google.com/document/d/1evHnb1uLlSbvHAAsmOXyc25x3uh1DjgNa8u1RHvwVhk/edit# for investigating V8 state in crash dumps. This change adds a new library, v8_debug_helper, for providing platform- agnostic assistance with postmortem debugging. This library can be used by extensions built for debuggers such as WinDbg or lldb. Its public API is described by debug-helper.h; currently the only method it exposes is GetObjectProperties, but we'd like to add more functionality over time. The API surface is restricted to plain C-style structs and pointers, so that it's easy to link from a debugger extension built with a different toolchain. This change also adds a new cctest file to exercise some basic interaction with the new library. The API function GetObjectProperties takes an object pointer (which could be compressed, or weak, or a SMI), and returns a string description of the object and a list of properties the object contains. For now, the list of properties is entirely based on Torque object definitions, but we expect to add custom properties in future updates so that it can be easier to make sense of complex data structures such as dictionaries. GetObjectProperties does several things that are intended to generate somewhat useful results even in cases where memory may be corrupt or unavailable: - The caller may optionally provide a type string which will be used if the memory for the object's Map is inaccessible. - All object pointers are compared against the list of known objects generated by mkgrokdump. The caller may optionally provide the pointers for the first pages of various heap spaces, to avoid spurious matches. If those pointers are not provided, then any matches are prefixed with "maybe" in the resulting description string, such as "maybe UndefinedValue (0x4288000341 <Oddball>)". Bug: v8:9376 Change-Id: Iebf3cc2dea3133c7811bcefcdf38d9458b02fded Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1628012 Commit-Queue: Seth Brenith <seth.brenith@microsoft.com> Reviewed-by: Yang Guo <yangguo@chromium.org> Reviewed-by: Michael Stanton <mvstanton@chromium.org> Cr-Commit-Position: refs/heads/master@{#62882}
64 lines
2.1 KiB
Python
64 lines
2.1 KiB
Python
#!/usr/bin/env python
|
|
# Copyright 2019 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.
|
|
|
|
"""This program writes a C++ file that can be used to look up whether a given
|
|
address matches known object locations. The first argument is the directory
|
|
containing the file v8heapconst.py; the second argument is the output .cc file.
|
|
"""
|
|
|
|
import sys
|
|
sys.path.insert(0, sys.argv[1])
|
|
import v8heapconst
|
|
|
|
out = """
|
|
#include <cstdint>
|
|
#include <string>
|
|
|
|
namespace v8_debug_helper_internal {
|
|
"""
|
|
|
|
def iterate_objects(target_space, camel_space_name):
|
|
global out
|
|
result = []
|
|
for (space, offset), (instance_type, name) in v8heapconst.KNOWN_MAPS.items():
|
|
if space == target_space:
|
|
result.append((offset, name))
|
|
for (space, offset), name in v8heapconst.KNOWN_OBJECTS.items():
|
|
if space == target_space:
|
|
result.append((offset, name))
|
|
out = out + '\nstd::string FindKnownObjectIn' + camel_space_name \
|
|
+ '(uintptr_t offset) {\n switch (offset) {\n'
|
|
for offset, name in result:
|
|
out = out + ' case ' + str(offset) + ': return "' + name + '";\n'
|
|
out = out + ' default: return "";\n }\n}\n'
|
|
|
|
iterate_objects('map_space', 'MapSpace')
|
|
iterate_objects('read_only_space', 'ReadOnlySpace')
|
|
iterate_objects('old_space', 'OldSpace')
|
|
|
|
def iterate_maps(target_space, camel_space_name):
|
|
global out
|
|
out = out + '\nint FindKnownMapInstanceTypeIn' + camel_space_name \
|
|
+ '(uintptr_t offset) {\n switch (offset) {\n'
|
|
for (space, offset), (instance_type, name) in v8heapconst.KNOWN_MAPS.items():
|
|
if space == target_space:
|
|
out = out + ' case ' + str(offset) + ': return ' + str(instance_type) \
|
|
+ ';\n'
|
|
out = out + ' default: return -1;\n }\n}\n'
|
|
|
|
iterate_maps('map_space', 'MapSpace')
|
|
iterate_maps('read_only_space', 'ReadOnlySpace')
|
|
|
|
out = out + '\n}\n'
|
|
|
|
try:
|
|
with open(sys.argv[2], "r") as out_file:
|
|
if out == out_file.read():
|
|
sys.exit(0) # No modification needed.
|
|
except:
|
|
pass # File probably doesn't exist; write it.
|
|
with open(sys.argv[2], "w") as out_file:
|
|
out_file.write(out)
|