提交 1f12bc3d 编写于 作者: I isidor

debug: fetch the rest of the callstack lazily

fixes #25605
上级 aa8f889b
......@@ -379,7 +379,7 @@ export class Thread implements IThread {
constructor(public process: IProcess, public name: string, public threadId: number) {
this.fetchPromise = null;
this.stoppedDetails = null;
this.callStack = null;
this.callStack = [];
this.stopped = false;
}
......@@ -389,7 +389,7 @@ export class Thread implements IThread {
public clearCallStack(): void {
this.fetchPromise = null;
this.callStack = null;
this.callStack = [];
}
public getCallStack(): IStackFrame[] {
......@@ -779,8 +779,8 @@ export class Model implements IModel {
}
}
public fetchCallStack(thread: Thread): TPromise<void> {
return thread.fetchCallStack().then(() => {
public fetchCallStack(thread: IThread): TPromise<void> {
return (<Thread>thread).fetchCallStack().then(() => {
this._onDidChangeCallStack.fire();
});
}
......
......@@ -7,6 +7,7 @@ import * as nls from 'vs/nls';
import * as lifecycle from 'vs/base/common/lifecycle';
import Event, { Emitter } from 'vs/base/common/event';
import * as paths from 'vs/base/common/paths';
import { RunOnceScheduler } from 'vs/base/common/async';
import * as strings from 'vs/base/common/strings';
import { generateUuid } from 'vs/base/common/uuid';
import uri from 'vs/base/common/uri';
......@@ -79,6 +80,7 @@ export class DebugService implements debug.IDebugService {
private debugType: IContextKey<string>;
private debugState: IContextKey<string>;
private breakpointsToSendOnResourceSaved: Set<string>;
private callStackScheduler: RunOnceScheduler;
constructor(
@IStorageService private storageService: IStorageService,
......@@ -117,6 +119,17 @@ export class DebugService implements debug.IDebugService {
this.loadExceptionBreakpoints(), this.loadWatchExpressions());
this.toDispose.push(this.model);
this.viewModel = new ViewModel(this.storageService.get(DEBUG_SELECTED_CONFIG_NAME_KEY, StorageScope.WORKSPACE, null));
this.callStackScheduler = new RunOnceScheduler(() => {
const focusedThread = this.viewModel.focusedThread;
if (focusedThread) {
const callStack = focusedThread.getCallStack();
// Some adapters might not respect the number levels in StackTraceRequest and might
// return more stackFrames than requested. For those do not send an additional stackTrace request.
if (callStack.length <= 1) {
this.model.fetchCallStack(focusedThread).done(undefined, errors.onUnexpectedError);
}
}
}, 420);
this.registerListeners(lifecycleService);
}
......@@ -295,11 +308,7 @@ export class DebugService implements debug.IDebugService {
// Second retrieves the rest of the call stack. For performance reasons #25605
this.model.fetchCallStack(thread).then(() => {
const callStack = thread.getCallStack();
// Some adapters might not respect the number levels in StackTraceRequest and might
// return more stackFrames than requested. For those do not send an additional stackTrace request.
if (callStack.length <= 1) {
this.model.fetchCallStack(thread).done(undefined, errors.onUnexpectedError);
}
this.callStackScheduler.schedule();
if (callStack.length > 0 && !this.viewModel.focusedStackFrame) {
// focus first stack frame from top that has source location if no other stack frame is focussed
const stackFrameToFocus = first(callStack, sf => sf.source && sf.source.available, callStack[0]);
......
......@@ -370,7 +370,7 @@ export class CallStackDataSource implements IDataSource {
if (thread.stoppedDetails && thread.stoppedDetails.framesErrorMessage) {
return callStack.concat([thread.stoppedDetails.framesErrorMessage]);
}
if (thread.stoppedDetails && thread.stoppedDetails.totalFrames > callStack.length) {
if (thread.stoppedDetails && thread.stoppedDetails.totalFrames > callStack.length && callStack.length > 1) {
return callStack.concat([new ThreadAndProcessIds(thread.process.getId(), thread.threadId)]);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册