• Seth Brenith's avatar
    Reland "Add postmortem debugging helper library" · 0921e8f2
    Seth Brenith authored
    This is a reland of 517ab73f
    
    Updates since original: now compressed pointers passed to the function
    GetObjectProperties are required to be sign-extended. Previously, the
    function allowed zero-extended values, but that led to ambiguity on
    pointers like 0x88044919: is it compressed or is the heap range actually
    centered on 0x100000000?
    
    Original change's description:
    > Add postmortem debugging helper library
    >
    > 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}
    
    Bug: v8:9376
    Change-Id: I866a1cc9d4c34bfe10c7b98462451fe69763cf3f
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1717090Reviewed-by: 's avatarMichael Achenbach <machenbach@chromium.org>
    Reviewed-by: 's avatarMichael Stanton <mvstanton@chromium.org>
    Commit-Queue: Seth Brenith <seth.brenith@microsoft.com>
    Cr-Commit-Position: refs/heads/master@{#63008}
    0921e8f2
BUILD.gn 2.3 KB
# 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.

import("../../gni/snapshot_toolchain.gni")
import("../../gni/v8.gni")

config("internal_config") {
  visibility = [ ":*" ]  # Only targets in this file can depend on this.

  if (is_component_build) {
    defines = [ "BUILDING_V8_DEBUG_HELPER" ]
  }

  include_dirs = [
    ".",
    "../..",
    "$target_gen_dir",
    "$target_gen_dir/../..",
  ]
}

# This config should be applied to code using v8_debug_helper.
config("external_config") {
  if (is_component_build) {
    defines = [ "USING_V8_DEBUG_HELPER" ]
  }
  include_dirs = [ "." ]
}

action("run_mkgrokdump") {
  testonly = true
  visibility = [ ":*" ]

  deps = [
    "../../test/mkgrokdump:mkgrokdump($v8_generator_toolchain)",
  ]

  script = "../run.py"

  outputs = [
    "$target_gen_dir/v8heapconst.py",
  ]

  args = [
    "./" + rebase_path(
            get_label_info(
                    "../../test/mkgrokdump:mkgrokdump($v8_generator_toolchain)",
                    "root_out_dir") + "/mkgrokdump",
            root_build_dir),
    "--outfile",
    rebase_path("$target_gen_dir/v8heapconst.py", root_build_dir),
  ]
}

action("gen_heap_constants") {
  testonly = true
  visibility = [ ":*" ]
  deps = [
    ":run_mkgrokdump",
  ]
  script = "gen-heap-constants.py"
  outputs = [
    "$target_gen_dir/heap-constants-gen.cc",
  ]
  args = [
    rebase_path(target_gen_dir, root_build_dir),
    rebase_path("$target_gen_dir/heap-constants-gen.cc", root_build_dir),
  ]
}

v8_component("v8_debug_helper") {
  testonly = true

  public = [
    "debug-helper.h",
  ]

  sources = [
    "$target_gen_dir/../../torque-generated/class-debug-readers-tq.cc",
    "$target_gen_dir/../../torque-generated/class-debug-readers-tq.h",
    "$target_gen_dir/heap-constants-gen.cc",
    "debug-helper-internal.cc",
    "debug-helper-internal.h",
    "debug-helper.h",
    "get-object-properties.cc",
    "heap-constants.cc",
    "heap-constants.h",
  ]

  deps = [
    ":gen_heap_constants",
    "../..:run_torque",
    "../..:v8_headers",
    "../..:v8_libbase",
  ]

  configs = [ ":internal_config" ]
  if (v8_enable_i18n_support) {
    configs += [ "//third_party/icu:icu_config" ]
  }

  public_configs = [ ":external_config" ]
}