diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java
index d04d1e9ea8942e978de45977c2a677c8084d3062..7a73ae2d2bdef0f3a1b5a84f852e2fb88d03207b 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java
@@ -276,17 +276,27 @@ public final class Utils {
      */
     @TruffleBoundary
     public static String createStackTrace(boolean printFrameSlots) {
-        StringBuilder str = new StringBuilder();
-
         FrameInstance current = Truffle.getRuntime().getCurrentFrame();
-        dumpFrame(str, current.getCallTarget(), current.getFrame(FrameAccess.READ_ONLY, true), printFrameSlots, current.isVirtualFrame());
-
-        Truffle.getRuntime().iterateFrames(frameInstance -> {
-            dumpFrame(str, frameInstance.getCallTarget(), frameInstance.getFrame(FrameAccess.READ_ONLY, true), printFrameSlots, frameInstance.isVirtualFrame());
-            return null;
-        });
-        str.append("\n");
-        return str.toString();
+        if (current == null) {
+            return "no R stack trace available\n";
+        } else {
+            StringBuilder str = new StringBuilder();
+            dumpFrame(str, current.getCallTarget(), current.getFrame(FrameAccess.READ_ONLY, true), false, current.isVirtualFrame());
+            Truffle.getRuntime().iterateFrames(frameInstance -> {
+                dumpFrame(str, frameInstance.getCallTarget(), frameInstance.getFrame(FrameAccess.READ_ONLY, true), false, frameInstance.isVirtualFrame());
+                return null;
+            });
+            if (printFrameSlots) {
+                str.append("\n\nwith frame slot contents:\n");
+                dumpFrame(str, current.getCallTarget(), current.getFrame(FrameAccess.READ_ONLY, true), true, current.isVirtualFrame());
+                Truffle.getRuntime().iterateFrames(frameInstance -> {
+                    dumpFrame(str, frameInstance.getCallTarget(), frameInstance.getFrame(FrameAccess.READ_ONLY, true), true, frameInstance.isVirtualFrame());
+                    return null;
+                });
+            }
+            str.append("\n");
+            return str.toString();
+        }
     }
 
     private static void dumpFrame(StringBuilder str, CallTarget callTarget, Frame frame, boolean printFrameSlots, boolean isVirtual) {
@@ -295,15 +305,13 @@ public final class Utils {
         }
         SourceSection callSrc = RArguments.getCallSourceSection(frame);
         str.append("Frame: ").append(callTarget).append(isVirtual ? " (virtual)" : "");
-        if (callSrc == null) {
-            str.append("\n  <no call info>");
-        } else {
-            str.append("\n  called as: ").append(callSrc.getCode());
+        if (callSrc != null) {
+            str.append(" (called as: ").append(callSrc.getCode()).append(')');
         }
         if (printFrameSlots) {
             FrameDescriptor frameDescriptor = frame.getFrameDescriptor();
             for (FrameSlot s : frameDescriptor.getSlots()) {
-                str.append("\n  ").append(s.getIdentifier()).append("=").append(frame.getValue(s));
+                str.append("\n      ").append(s.getIdentifier()).append(" = ").append(frame.getValue(s));
             }
         }
     }