From 701b6044575940fa4e83afaf88dafa0402fc4d7b Mon Sep 17 00:00:00 2001 From: "SND\\kernelnet_cp" Date: Fri, 20 Jan 2012 07:10:44 +0000 Subject: [PATCH] [0.1.x] fixed : issue #10181 ( exception information (!py) ) git-svn-id: https://pykd.svn.codeplex.com/svn@73328 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/dbgext.cpp | 59 +++++++++---------------------------------------- 1 file changed, 10 insertions(+), 49 deletions(-) diff --git a/pykd/dbgext.cpp b/pykd/dbgext.cpp index a7e1c9d..41213dd 100644 --- a/pykd/dbgext.cpp +++ b/pykd/dbgext.cpp @@ -994,60 +994,21 @@ py( PDEBUG_CLIENT4 client, PCSTR args ) PyErr_NormalizeException( &errtype, &errvalue, &traceback ); - if(errvalue != NULL) - { - if ( PyErr_GivenExceptionMatches(errtype, PyExc_SyntaxError)) - { - PyObject *filenamePtr = PyObject_GetAttrString(errvalue ,"filename" ); - PyObject *filenameStr = PyUnicode_FromObject(filenamePtr); - PyObject *linenoPtr = PyObject_GetAttrString(errvalue ,"lineno"); - PyObject *offsetPtr = PyObject_GetAttrString(errvalue ,"offset"); - PyObject *msg = PyObject_GetAttrString(errvalue, "msg"); - PyObject *msgStr = PyUnicode_FromObject(msg); + std::wstringstream sstr; - std::wstringstream sstr; - sstr << std::endl << L"Syntax error" << std::endl; - sstr << std::endl << PyUnicode_AS_UNICODE( msgStr ) << std::endl << std::endl; - sstr << "Filename: " << PyUnicode_AS_UNICODE( filenameStr ); - sstr << " Line: " << PyInt_AsLong( linenoPtr ); - sstr << " Pos: " << PyInt_AsLong( offsetPtr ); - sstr << std::endl; + python::object lst = + python::object( tracebackModule.attr("format_exception" ) )( + python::handle<>( errtype ), + python::handle<>( python::allow_null( errvalue ) ), + python::handle<>( python::allow_null( traceback ) ) ); - dbgClient->eprintln( sstr.str() ); + sstr << std::endl << std::endl; - Py_XDECREF( linenoPtr ); - Py_XDECREF( offsetPtr ); - Py_XDECREF( msgStr ); - Py_XDECREF( msg ); - } - else - { - PyObject *errvalueStr= PyUnicode_FromObject(errvalue); - if ( errvalueStr ) - { - dbgClient->eprintln( PyUnicode_AS_UNICODE( errvalueStr ) ); - Py_DECREF(errvalueStr); - } + for ( long i = 0; i < python::len(lst); ++i ) + sstr << std::wstring( python::extract(lst[i]) ) << std::endl; - if ( traceback ) - { - python::object traceObj( python::handle<>( python::borrowed( traceback ) ) ); - - dbgClient->eprintln( L"\nTraceback:" ); - - python::object pFunc( tracebackModule.attr("format_tb") ); - python::list traceList( pFunc( traceObj ) ); - - for ( long i = 0; i < python::len(traceList); ++i ) - dbgClient->eprintln( python::extract(traceList[i]) ); - } - } - } - - Py_XDECREF(errvalue); - Py_XDECREF(errtype); - Py_XDECREF(traceback); + dbgClient->eprintln( sstr.str() ); } }