diff --git a/modules/callbacks.inc b/modules/callbacks.inc
index 31ecda3..12b997f 100644
--- a/modules/callbacks.inc
+++ b/modules/callbacks.inc
@@ -639,6 +639,14 @@ function entity_metadata_no_hook_node_access($op, $node = NULL, $account = NULL)
         return node_access($op, $node->type, $account);
       }
       else {
+        // Before throwing the exception, log stack data to assist in tracking
+        // down the source of invalid arguments to entity_access(), as the API
+        // clarifications have caused some confusion.
+        // @see http://drupal.org/node/1780646#comment-7872635
+        $stack = debug_backtrace();
+        $funcstack = array_map('_entity_funcstack_frame', $stack);
+        watchdog('entity', '@type %arg passed to entity_access() instead of a node object. Stack data follows: <pre>@frame0</pre><pre>@funcstack</pre>', array('@type' => ucfirst(gettype($node)), '%arg' => print_r($node, TRUE), '@frame0' => print_r($stack[0], TRUE), '@funcstack' => print_r($funcstack, TRUE)),  WATCHDOG_ERROR);
+
         throw new EntityMalformedException('Permission to create a node was requested but no node type was given.');
       }
     }
@@ -665,6 +673,28 @@ function entity_metadata_no_hook_node_access($op, $node = NULL, $account = NULL)
 }
 
 /**
+ * Debug logging helper for entity_metadata_no_hook_node_access()
+ */
+function _entity_funcstack_frame($frame) {
+  $output = '';
+  if (!empty($frame['class']) && !empty($frame['type'])) {
+    $output .= $frame['class'] . $frame['type'];
+  }
+  if (!empty($frame['function'])) {
+    $output .= $frame['function'] . '()';
+  }
+  if (!empty($frame['file'])) {
+    if (!empty($frame['line'])) {
+      $output .= ' at ' . $frame['file'] . ':' . $frame['line'];
+    }
+    else {
+      $output .= ' in ' . $frame['file'];
+    }
+  }
+  return $output;
+}
+
+/**
  * Access callback for the user entity.
  */
 function entity_metadata_user_access($op, $entity = NULL, $account = NULL, $entity_type) {
