Revert "[lldb-vscode] Send Statistics Dump in terminated event"

This reverts commit c8a26f8c6d.

Returning full statistics result in "terminated" (DAP) event could result in delay in the UI when debugging from VSCode.

If the program run to exit and debug session terminates. The DAP event order will be: exited event --> terminateCommands --> terminated event --> disconnect request --> disconnect response.

The debugging UI in VSCode corresponds to "disconnect" request/response. If the terminated event is taking long to process, the IDE won't quit debugging UI until it's done.

For big binary (tested example has 29 GB of debug info), it can cause ~15s delay in terminated event itself. And the UI could take ~20s to reflect.

This may cause confusion in debug sessions. We should persuit a more lightweight return or other solution to return such info.
This commit is contained in:
Wanyi Ye 2022-10-26 19:49:03 -07:00
parent ada9ab6107
commit 7bbd0fba98
9 changed files with 2 additions and 119 deletions

View File

@ -369,13 +369,7 @@ class DebugCommunication(object):
def wait_for_exited(self):
event_dict = self.wait_for_event('exited')
if event_dict is None:
raise ValueError("didn't get exited event")
return event_dict
def wait_for_terminated(self):
event_dict = self.wait_for_event('terminated')
if event_dict is None:
raise ValueError("didn't get terminated event")
raise ValueError("didn't get stopped event")
return event_dict
def get_initialize_value(self, key):

View File

@ -1,17 +0,0 @@
DYLIB_NAME := foo
DYLIB_CXX_SOURCES := foo.cpp
CXX_SOURCES := main.cpp
LD_EXTRAS := -Wl,-rpath "-Wl,$(shell pwd)"
USE_LIBDL :=1
include Makefile.rules
all: a.out.stripped
a.out.stripped:
strip -o a.out.stripped a.out
ifneq "$(CODESIGN)" ""
$(CODESIGN) -fs - a.out.stripped
endif

View File

@ -1,60 +0,0 @@
"""
Test lldb-vscode terminated event
"""
import vscode
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
import lldbvscode_testcase
import re
import json
class TestVSCode_terminatedEvent(lldbvscode_testcase.VSCodeTestCaseBase):
@skipIfWindows
@skipIfRemote
def test_terminated_event(self):
'''
Terminated Event
Now contains the statistics of a debug session:
metatdata:
totalDebugInfoByteSize > 0
totalDebugInfoEnabled > 0
totalModuleCountHasDebugInfo > 0
...
targetInfo:
totalBreakpointResolveTime > 0
breakpoints:
recognize function breakpoint
recognize source line breakpoint
It should contains the breakpoints info: function bp & source line bp
'''
program_basename = "a.out.stripped"
program = self.getBuildArtifact(program_basename)
self.build_and_launch(program)
# Set breakpoints
functions = ['foo']
breakpoint_ids = self.set_function_breakpoints(functions)
self.assertEquals(len(breakpoint_ids), len(functions), 'expect one breakpoint')
main_bp_line = line_number('main.cpp', '// main breakpoint 1')
breakpoint_ids.append(self.set_source_breakpoints('main.cpp', [main_bp_line]))
self.continue_to_breakpoints(breakpoint_ids)
self.continue_to_exit()
statistics = json.loads(self.vscode.wait_for_terminated()['statistics'])
self.assertTrue(statistics['totalDebugInfoByteSize'] > 0)
self.assertTrue(statistics['totalDebugInfoEnabled'] > 0)
self.assertTrue(statistics['totalModuleCountHasDebugInfo'] > 0)
# lldb-vscode debugs one target at a time
self.assertTrue(statistics['targets'][0]['totalBreakpointResolveTime'] > 0)
breakpoints = statistics['targets'][0]['breakpoints']
self.assertIn('foo',
breakpoints[0]['details']['Breakpoint']['BKPTResolver']['Options']['SymbolNames'],
'foo is a symbol breakpoint')
self.assertTrue(breakpoints[1]['details']['Breakpoint']['BKPTResolver']['Options']['FileName'].endswith('main.cpp'),
'target has source line breakpoint in main.cpp')

View File

@ -1,3 +0,0 @@
int foo() {
return 12;
}

View File

@ -1 +0,0 @@
int foo();

View File

@ -1,8 +0,0 @@
#include <iostream>
#include "foo.h"
int main(int argc, char const *argv[]) {
std::cout << "Hello World!" << std::endl; // main breakpoint 1
foo();
return 0;
}

View File

@ -19,7 +19,6 @@
#include "lldb/API/SBBreakpoint.h"
#include "lldb/API/SBBreakpointLocation.h"
#include "lldb/API/SBDeclaration.h"
#include "lldb/API/SBStructuredData.h"
#include "lldb/API/SBValue.h"
#include "lldb/Host/PosixApi.h"
@ -1140,21 +1139,6 @@ CreateRunInTerminalReverseRequest(const llvm::json::Object &launch_request,
return reverse_request;
}
llvm::json::Object CreateTerminatedEventObject() {
llvm::json::Object event(CreateEventObject("terminated"));
lldb::SBStructuredData statistics = g_vsc.target.GetStatistics();
bool is_dictionary =
statistics.GetType() == lldb::eStructuredDataTypeDictionary;
if (!is_dictionary) {
return event;
}
lldb::SBStream stats_stream;
statistics.GetAsJSON(stats_stream);
event.try_emplace("statistics", llvm::json::fixUTF8(stats_stream.GetData()));
return event;
}
std::string JSONToString(const llvm::json::Value &json) {
std::string data;
llvm::raw_string_ostream os(data);

View File

@ -485,12 +485,6 @@ CreateRunInTerminalReverseRequest(const llvm::json::Object &launch_request,
llvm::StringRef debug_adaptor_path,
llvm::StringRef comm_file);
/// Create a "Terminated" JSON object that contains statistics
///
/// \return
/// A body JSON object with debug info and breakpoint info
llvm::json::Object CreateTerminatedEventObject();
/// Convert a given JSON object to a string.
std::string JSONToString(const llvm::json::Value &json);

View File

@ -204,7 +204,7 @@ void SendTerminatedEvent() {
g_vsc.sent_terminated_event = true;
g_vsc.RunTerminateCommands();
// Send a "terminated" event
llvm::json::Object event(CreateTerminatedEventObject());
llvm::json::Object event(CreateEventObject("terminated"));
g_vsc.SendJSON(llvm::json::Value(std::move(event)));
}
}