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}
52 lines
1.6 KiB
C++
52 lines
1.6 KiB
C++
// 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.
|
|
|
|
#include "heap-constants.h"
|
|
#include "src/common/globals.h"
|
|
|
|
namespace d = v8::debug_helper;
|
|
|
|
namespace v8_debug_helper_internal {
|
|
|
|
std::string FindKnownObject(uintptr_t address, const d::Roots& roots) {
|
|
uintptr_t containing_page = address & ~i::kPageAlignmentMask;
|
|
uintptr_t offset_in_page = address & i::kPageAlignmentMask;
|
|
|
|
// If there's a match with a known root, then search only that page.
|
|
if (containing_page == roots.map_space) {
|
|
return FindKnownObjectInMapSpace(offset_in_page);
|
|
}
|
|
if (containing_page == roots.old_space) {
|
|
return FindKnownObjectInOldSpace(offset_in_page);
|
|
}
|
|
if (containing_page == roots.read_only_space) {
|
|
return FindKnownObjectInReadOnlySpace(offset_in_page);
|
|
}
|
|
|
|
// For any unknown roots, compile a list of things this object might be.
|
|
std::string result;
|
|
if (roots.map_space == 0) {
|
|
std::string sub_result = FindKnownObjectInMapSpace(offset_in_page);
|
|
if (!sub_result.empty()) {
|
|
result += "maybe " + sub_result;
|
|
}
|
|
}
|
|
if (roots.old_space == 0) {
|
|
std::string sub_result = FindKnownObjectInOldSpace(offset_in_page);
|
|
if (!sub_result.empty()) {
|
|
result = (result.empty() ? "" : result + ", ") + "maybe " + sub_result;
|
|
}
|
|
}
|
|
if (roots.read_only_space == 0) {
|
|
std::string sub_result = FindKnownObjectInReadOnlySpace(offset_in_page);
|
|
if (!sub_result.empty()) {
|
|
result = (result.empty() ? "" : result + ", ") + "maybe " + sub_result;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
} // namespace v8_debug_helper_internal
|