diff options
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/python/py-function.c | 51 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-function.exp | 26 |
4 files changed, 88 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7aec962..5388eef 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2011-03-22 Phil Muldoon <pmuldoon@redhat.com> + + PR python/12183 + + * python/py-function.c (fnpy_call): Treat GdbErrors differently to + other error classes. Do not print stack trace. + 2011-03-21 Jan Kratochvil <jan.kratochvil@redhat.com> * dwarf2read.c (producer_is_gxx_lt_4_6): New function. diff --git a/gdb/python/py-function.c b/gdb/python/py-function.c index 47d916b..0c3e6f2 100644 --- a/gdb/python/py-function.c +++ b/gdb/python/py-function.c @@ -79,8 +79,55 @@ fnpy_call (struct gdbarch *gdbarch, const struct language_defn *language, if (!result) { - gdbpy_print_stack (); - error (_("Error while executing Python code.")); + PyObject *ptype, *pvalue, *ptraceback; + char *msg; + + PyErr_Fetch (&ptype, &pvalue, &ptraceback); + + /* Try to fetch an error message contained within ptype, pvalue. + When fetching the error message we need to make our own copy, + we no longer own ptype, pvalue after the call to PyErr_Restore. */ + + msg = gdbpy_exception_to_string (ptype, pvalue); + make_cleanup (xfree, msg); + + if (msg == NULL) + { + /* An error occurred computing the string representation of the + error message. This is rare, but we should inform the user. */ + + printf_filtered (_("An error occurred in a Python " + "convenience function\n" + "and then another occurred computing the " + "error message.\n")); + gdbpy_print_stack (); + } + + /* Don't print the stack for gdb.GdbError exceptions. + It is generally used to flag user errors. + + We also don't want to print "Error occurred in Python command" + for user errors. However, a missing message for gdb.GdbError + exceptions is arguably a bug, so we flag it as such. */ + + if (!PyErr_GivenExceptionMatches (ptype, gdbpy_gdberror_exc) + || msg == NULL || *msg == '\0') + { + PyErr_Restore (ptype, pvalue, ptraceback); + gdbpy_print_stack (); + if (msg != NULL && *msg != '\0') + error (_("Error occurred in Python convenience function: %s"), + msg); + else + error (_("Error occurred in Python convenience function.")); + } + else + { + Py_XDECREF (ptype); + Py_XDECREF (pvalue); + Py_XDECREF (ptraceback); + error ("%s", msg); + } } value = convert_value_from_python (result); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 2abb0f9..5508901 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-03-22 Phil Muldoon <pmuldoon@redhat.com> + + PR python/12183 + + * gdb.python/py-function.exp: Add GdbError tests. + 2011-03-18 Pedro Alves <pedro@codesourcery.com> * gdb.trace/unavailable.cc (args_test_func, local_test_func) diff --git a/gdb/testsuite/gdb.python/py-function.exp b/gdb/testsuite/gdb.python/py-function.exp index bbbbf42..dfccdff 100644 --- a/gdb/testsuite/gdb.python/py-function.exp +++ b/gdb/testsuite/gdb.python/py-function.exp @@ -69,3 +69,29 @@ gdb_py_test_multiple "input int-returning function" \ gdb_test "print \$yes() && \$yes()" " = 1" "call yes with &&" gdb_test "print \$yes() || \$yes()" " = 1" "call yes with ||" + +gdb_py_test_multiple "Test GDBError" \ + "python" "" \ + "class GDBError(gdb.Function):" "" \ + " def __init__(self):" "" \ + " gdb.Function.__init__(self, 'gdberror')" "" \ + " def invoke(self):" "" \ + " raise gdb.GdbError(\"This is a GdbError\")" "" \ + "GDBError ()" "" \ + "end" "" + +gdb_test "print \$gdberror()" "This is a GdbError.*" \ + "Test GdbError. There should not be a stack trace" + +gdb_py_test_multiple "Test Normal Error" \ + "python" "" \ + "class NormalError(gdb.Function):" "" \ + " def __init__(self):" "" \ + " gdb.Function.__init__(self, 'normalerror')" "" \ + " def invoke(self):" "" \ + " raise RuntimeError(\"This is a Normal Error\")" "" \ + "NormalError ()" "" \ + "end" "" + +gdb_test "print \$normalerror()" "Traceback.*File.*line 5.*in invoke.*RuntimeError.*This is a Normal Error.*" \ + "Test a Runtime error. There should be a stack trace." |