Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
f4c2b4d1
V
vscode
项目概览
xxadev
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f4c2b4d1
编写于
5月 12, 2017
作者:
I
isidor
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
debug: fetch first call stack to improve perf
#25605
上级
e1386fea
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
42 addition
and
26 deletion
+42
-26
src/vs/workbench/parts/debug/common/debugModel.ts
src/vs/workbench/parts/debug/common/debugModel.ts
+28
-24
src/vs/workbench/parts/debug/electron-browser/debugService.ts
...vs/workbench/parts/debug/electron-browser/debugService.ts
+9
-1
src/vs/workbench/parts/debug/electron-browser/debugViewer.ts
src/vs/workbench/parts/debug/electron-browser/debugViewer.ts
+5
-1
未找到文件。
src/vs/workbench/parts/debug/common/debugModel.ts
浏览文件 @
f4c2b4d1
...
...
@@ -371,15 +371,15 @@ export class StackFrame implements IStackFrame {
}
export
class
Thread
implements
IThread
{
private
promisedCallStack
:
TPromise
<
IStackFrame
[]
>
;
private
ca
chedCa
llStack
:
IStackFrame
[];
private
fetchPromise
:
TPromise
<
void
>
;
private
callStack
:
IStackFrame
[];
public
stoppedDetails
:
IRawStoppedDetails
;
public
stopped
:
boolean
;
constructor
(
public
process
:
IProcess
,
public
name
:
string
,
public
threadId
:
number
)
{
this
.
promisedCallStack
=
null
;
this
.
fetchPromise
=
null
;
this
.
stoppedDetails
=
null
;
this
.
ca
chedCa
llStack
=
null
;
this
.
callStack
=
null
;
this
.
stopped
=
false
;
}
...
...
@@ -388,43 +388,41 @@ export class Thread implements IThread {
}
public
clearCallStack
():
void
{
this
.
promisedCallStack
=
null
;
this
.
ca
chedCa
llStack
=
null
;
this
.
fetchPromise
=
null
;
this
.
callStack
=
null
;
}
public
getCallStack
():
IStackFrame
[]
{
return
this
.
ca
chedCa
llStack
;
return
this
.
callStack
;
}
/**
* Queries the debug adapter for the callstack and returns a promise
with
*
the stack frames of the callstack
.
* Queries the debug adapter for the callstack and returns a promise
*
which completes once the call stack has been retrieved
.
* If the thread is not stopped, it returns a promise to an empty array.
* Only
gets the first 20 stack frame
s. Calling this method consecutive times
*
with getAdditionalStackFrames = true
gets the remainder of the call stack.
* Only
fetches the first stack frame for performance reason
s. Calling this method consecutive times
* gets the remainder of the call stack.
*/
public
fetchCallStack
(
getAdditionalStackFrames
=
false
):
TPromise
<
IStackFrame
[]
>
{
public
fetchCallStack
(
):
TPromise
<
void
>
{
if
(
!
this
.
stopped
)
{
return
TPromise
.
as
(
[]
);
return
TPromise
.
as
(
null
);
}
if
(
!
this
.
promisedCallStack
)
{
this
.
promisedCallStack
=
this
.
getCallStackImpl
(
0
).
then
(
callStack
=>
{
this
.
cachedCallStack
=
callStack
;
return
callStack
;
if
(
!
this
.
fetchPromise
)
{
this
.
fetchPromise
=
this
.
getCallStackImpl
(
0
,
1
).
then
(
callStack
=>
{
this
.
callStack
=
callStack
||
[];
});
}
else
if
(
getAdditionalStackFrames
)
{
this
.
promisedCallStack
=
this
.
promisedCallStack
.
then
(
callStackFirstPart
=>
this
.
getCallStackImpl
(
callStackFirstPart
.
length
).
then
(
callStackSecondPart
=>
{
this
.
cachedCallStack
=
callStackFirstPart
.
concat
(
callStackSecondPart
);
return
this
.
cachedCallStack
;
}
else
{
this
.
fetchPromise
=
this
.
fetchPromise
.
then
(()
=>
this
.
getCallStackImpl
(
this
.
callStack
.
length
,
20
).
then
(
callStackSecondPart
=>
{
this
.
callStack
=
this
.
callStack
.
concat
(
callStackSecondPart
);
}));
}
return
this
.
promisedCallStack
;
return
this
.
fetchPromise
;
}
private
getCallStackImpl
(
startFrame
:
number
):
TPromise
<
IStackFrame
[]
>
{
return
this
.
process
.
session
.
stackTrace
({
threadId
:
this
.
threadId
,
startFrame
,
levels
:
20
}).
then
(
response
=>
{
private
getCallStackImpl
(
startFrame
:
number
,
levels
:
number
):
TPromise
<
IStackFrame
[]
>
{
return
this
.
process
.
session
.
stackTrace
({
threadId
:
this
.
threadId
,
startFrame
,
levels
}).
then
(
response
=>
{
if
(
!
response
||
!
response
.
body
)
{
return
[];
}
...
...
@@ -781,6 +779,12 @@ export class Model implements IModel {
}
}
public
fetchCallStack
(
thread
:
Thread
):
TPromise
<
void
>
{
return
thread
.
fetchCallStack
().
then
(()
=>
{
this
.
_onDidChangeCallStack
.
fire
();
});
}
public
getBreakpoints
():
Breakpoint
[]
{
return
this
.
breakpoints
;
}
...
...
src/vs/workbench/parts/debug/electron-browser/debugService.ts
浏览文件 @
f4c2b4d1
...
...
@@ -291,7 +291,15 @@ export class DebugService implements debug.IDebugService {
const
thread
=
process
&&
process
.
getThread
(
threadId
);
if
(
thread
)
{
thread
.
fetchCallStack
().
then
(
callStack
=>
{
// Call fetch call stack twice, the first only return the top stack frame.
// 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
);
}
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
]);
...
...
src/vs/workbench/parts/debug/electron-browser/debugViewer.ts
浏览文件 @
f4c2b4d1
...
...
@@ -271,7 +271,7 @@ export class CallStackController extends BaseDebugController {
const
process
=
this
.
debugService
.
getModel
().
getProcesses
().
filter
(
p
=>
p
.
getId
()
===
threadAndProcessIds
.
processId
).
pop
();
const
thread
=
process
&&
process
.
getThread
(
threadAndProcessIds
.
threadId
);
if
(
thread
)
{
(
<
Thread
>
thread
).
fetchCallStack
(
true
)
(
<
Thread
>
thread
).
fetchCallStack
()
.
done
(()
=>
tree
.
refresh
(),
errors
.
onUnexpectedError
);
}
...
...
@@ -363,6 +363,10 @@ export class CallStackDataSource implements IDataSource {
private
getThreadChildren
(
thread
:
Thread
):
any
[]
{
const
callStack
:
any
[]
=
thread
.
getCallStack
();
if
(
!
callStack
)
{
return
[];
}
if
(
thread
.
stoppedDetails
&&
thread
.
stoppedDetails
.
framesErrorMessage
)
{
return
callStack
.
concat
([
thread
.
stoppedDetails
.
framesErrorMessage
]);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录