diff options
author | brendandouglas <brendandouglas@google.com> | 2018-06-12 09:39:38 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-06-12 09:40:42 -0700 |
commit | fe785e107d0f05bf8529d1460e017cbf5de184ec (patch) | |
tree | 55407c81a23f33f132209eb890b758493d4eb840 /src/main/java/com/google/devtools/build/lib/skylarkdebug | |
parent | f4b9ff40b8f1612571cc711560177af240d034d0 (diff) |
Skylark debugger: Fix NPE listing frames.
Environment$Continuation#caller is most definitely nullable in practice.
I suspect it's a bug in skylark itself, but for now, just properly mark
it nullable and handle it in the debugger.
Stack trace from NPE:
Caused by: java.lang.NullPointerException
at com.google.devtools.build.lib.syntax.Environment.listFrames(Environment.java:1197)
at com.google.devtools.build.lib.syntax.Environment.listFrames(Environment.java:81)
at com.google.devtools.build.lib.skylarkdebug.server.ThreadHandler.listFrames(ThreadHandler.java:236)
at com.google.devtools.build.lib.skylarkdebug.server.ThreadHandler.getThreadProto(ThreadHandler.java:345)
at com.google.devtools.build.lib.skylarkdebug.server.ThreadHandler.pauseCurrentThread(ThreadHandler.java:289)
at com.google.devtools.build.lib.skylarkdebug.server.ThreadHandler.pauseIfNecessary(ThreadHandler.java:203)
at com.google.devtools.build.lib.skylarkdebug.server.SkylarkDebugServer.pauseIfNecessary(SkylarkDebugServer.java:158)
at com.google.devtools.build.lib.skylarkdebug.server.SkylarkDebugServer$DebugAwareEval.exec(SkylarkDebugServer.java:262)
at com.google.devtools.build.lib.syntax.UserDefinedFunction.call(UserDefinedFunction.java:91)
at com.google.devtools.build.lib.syntax.BaseFunction.callWithArgArray(BaseFunction.java:462)
at com.google.devtools.build.lib.syntax.BaseFunction.call(BaseFunction.java:440)
at com.google.devtools.build.lib.analysis.skylark.SkylarkRuleConfiguredTargetUtil.lambda$buildRule$1(SkylarkRuleConfiguredTargetUtil.java:105)
at com.google.devtools.build.lib.skylarkdebug.server.SkylarkDebugServer.runWithDebugging(SkylarkDebugServer.java:142)
at com.google.devtools.build.lib.syntax.DebugServerUtils.runWithDebuggingIfEnabled(DebugServerUtils.java:70)
at com.google.devtools.build.lib.analysis.skylark.SkylarkRuleConfiguredTargetUtil.buildRule(SkylarkRuleConfiguredTargetUtil.java:100)
PiperOrigin-RevId: 200229036
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skylarkdebug')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skylarkdebug/proto/skylark_debugging.proto | 3 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skylarkdebug/server/DebugEventHelper.java | 13 |
2 files changed, 10 insertions, 6 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkdebug/proto/skylark_debugging.proto b/src/main/java/com/google/devtools/build/lib/skylarkdebug/proto/skylark_debugging.proto index f81185f20a..3d74f951af 100644 --- a/src/main/java/com/google/devtools/build/lib/skylarkdebug/proto/skylark_debugging.proto +++ b/src/main/java/com/google/devtools/build/lib/skylarkdebug/proto/skylark_debugging.proto @@ -213,7 +213,8 @@ message Frame { // The scopes that contain value bindings accessible in this frame. repeated Scope scope = 2; - // The source location where the frame is currently paused. + // The source location where the frame is currently paused. May not be set in + // some situations. Location location = 3; } diff --git a/src/main/java/com/google/devtools/build/lib/skylarkdebug/server/DebugEventHelper.java b/src/main/java/com/google/devtools/build/lib/skylarkdebug/server/DebugEventHelper.java index 0254484062..a389569bc2 100644 --- a/src/main/java/com/google/devtools/build/lib/skylarkdebug/server/DebugEventHelper.java +++ b/src/main/java/com/google/devtools/build/lib/skylarkdebug/server/DebugEventHelper.java @@ -159,11 +159,14 @@ final class DebugEventHelper { } static SkylarkDebuggingProtos.Frame getFrameProto(DebugFrame frame) { - return SkylarkDebuggingProtos.Frame.newBuilder() - .setFunctionName(frame.functionName()) - .setLocation(getLocationProto(frame.location())) - .addAllScope(getScopes(frame)) - .build(); + SkylarkDebuggingProtos.Frame.Builder builder = + SkylarkDebuggingProtos.Frame.newBuilder() + .setFunctionName(frame.functionName()) + .addAllScope(getScopes(frame)); + if (frame.location() != null) { + builder.setLocation(getLocationProto(frame.location())); + } + return builder.build(); } private static ImmutableList<Scope> getScopes(DebugFrame frame) { |