Index: docs/topics/signals.txt
===================================================================
--- docs/topics/signals.txt	(revision 16406)
+++ docs/topics/signals.txt	(working copy)
@@ -231,7 +231,7 @@
 There are two ways to send send signals in Django.
 
 .. method:: Signal.send(sender, **kwargs)
-.. method:: Signal.send_robust(sender, **kwargs)
+.. method:: Signal.send_robust(sender, append_traceback=True, **kwargs)
 
 To send a signal, call either :meth:`Signal.send` or :meth:`Signal.send_robust`.
 You must provide the ``sender`` argument, and may provide as many other keyword
@@ -260,7 +260,16 @@
 ``send_robust()`` catches all errors derived from Python's ``Exception`` class,
 and ensures all receivers are notified of the signal. If an error occurs, the
 error instance is returned in the tuple pair for the receiver that raised the error.
+If ``append_traceback`` is True, a ``traceback`` object with the call stack at the
+point where the exception occurred will also be added to the tuple. In that case,
+the tuple response would look like ``(receiver, error, traceback)``.
 
+
+.. versionchanged:: 1.4
+   A ``traceback`` object can be appended to the tuple response for a receiver that
+   raises an exception by setting ``append_traceback`` to ``True`` when calling
+   ``send_robust()``.
+
 Disconnecting signals
 =====================
 
Index: django/dispatch/dispatcher.py
===================================================================
--- django/dispatch/dispatcher.py	(revision 16406)
+++ django/dispatch/dispatcher.py	(working copy)
@@ -1,3 +1,4 @@
+import sys
 import weakref
 import threading
 
@@ -173,7 +174,7 @@
             responses.append((receiver, response))
         return responses
 
-    def send_robust(self, sender, **named):
+    def send_robust(self, sender, append_traceback=False, **named):
         """
         Send signal from sender to all connected receivers catching errors.
 
@@ -184,6 +185,10 @@
                 registered with a connect if you actually want something to
                 occur).
 
+            append_traceback
+                If an exception occurs in a receiver, append a traceback object
+                to the tuple result for that receiver.
+
             named
                 Named arguments which will be passed to receivers. These
                 arguments must be a subset of the argument names defined in
@@ -194,7 +199,8 @@
 
         If any receiver raises an error (specifically any subclass of
         Exception), the error instance is returned as the result for that
-        receiver.
+        receiver. If append_traceback is True, a traceback object will
+        also be included in the result, i.e. (receiver, error, traceback).
         """
         responses = []
         if not self.receivers:
@@ -206,7 +212,16 @@
             try:
                 response = receiver(signal=self, sender=sender, **named)
             except Exception, err:
-                responses.append((receiver, err))
+                if append_traceback:
+                    # Wrap traceback in try...finally to prevent circular reference
+                    # See warning at http://docs.python.org/library/sys.html#sys.exc_info
+                    try:
+                        traceback = sys.exc_info()[2]
+                        responses.append((receiver, err, traceback))
+                    finally:
+                        del traceback
+                else:
+                    responses.append((receiver, err))
             else:
                 responses.append((receiver, response))
         return responses
Index: tests/regressiontests/dispatch/tests/test_dispatcher.py
===================================================================
--- tests/regressiontests/dispatch/tests/test_dispatcher.py	(revision 16406)
+++ tests/regressiontests/dispatch/tests/test_dispatcher.py	(working copy)
@@ -1,5 +1,6 @@
 import gc
 import sys
+from types import TracebackType
 
 from django.dispatch import Signal
 from django.utils import unittest
@@ -98,8 +99,13 @@
         a_signal.connect(fails)
         result = a_signal.send_robust(sender=self, val="test")
         err = result[0][1]
+        self.assertEqual(len(result[0]), 2)
         self.assertTrue(isinstance(err, ValueError))
         self.assertEqual(err.args, ('this',))
+        
+        result = a_signal.send_robust(sender=self, append_traceback=True, val="test")
+        traceback = result[0][2]
+        self.assertTrue(isinstance(traceback, TracebackType))
         a_signal.disconnect(fails)
         self._testIsClean(a_signal)
 
