mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-29 20:03:33 +08:00
[0.1.x] added : syntax error output for !py command
git-svn-id: https://pykd.svn.codeplex.com/svn@71848 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
parent
5ee21bec08
commit
2e618b08d8
@ -806,26 +806,57 @@ py( PDEBUG_CLIENT4 client, PCSTR args )
|
|||||||
|
|
||||||
PyErr_Fetch( &errtype, &errvalue, &traceback );
|
PyErr_Fetch( &errtype, &errvalue, &traceback );
|
||||||
|
|
||||||
|
PyErr_NormalizeException( &errtype, &errvalue, &traceback );
|
||||||
|
|
||||||
if(errvalue != NULL)
|
if(errvalue != NULL)
|
||||||
{
|
{
|
||||||
PyObject *errvalueStr= PyUnicode_FromObject(errvalue);
|
if ( PyErr_GivenExceptionMatches(errtype, PyExc_SyntaxError))
|
||||||
|
|
||||||
dbgClient->eprintln( PyUnicode_AS_UNICODE( errvalueStr ) );
|
|
||||||
|
|
||||||
if ( traceback )
|
|
||||||
{
|
{
|
||||||
python::object traceObj( python::handle<>( python::borrowed( traceback ) ) );
|
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);
|
||||||
|
|
||||||
dbgClient->eprintln( L"\nTraceback:" );
|
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 pFunc( tracebackModule.attr("format_tb") );
|
dbgClient->eprintln( sstr.str() );
|
||||||
python::list traceList( pFunc( traceObj ) );
|
|
||||||
|
|
||||||
for ( long i = 0; i < python::len(traceList); ++i )
|
Py_XDECREF( linenoPtr );
|
||||||
dbgClient->eprintln( python::extract<std::wstring>(traceList[i]) );
|
Py_XDECREF( offsetPtr );
|
||||||
|
Py_XDECREF( msgStr );
|
||||||
|
Py_XDECREF( msg );
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PyObject *errvalueStr= PyUnicode_FromObject(errvalue);
|
||||||
|
|
||||||
Py_DECREF(errvalueStr);
|
if ( errvalueStr )
|
||||||
|
{
|
||||||
|
dbgClient->eprintln( PyUnicode_AS_UNICODE( errvalueStr ) );
|
||||||
|
Py_DECREF(errvalueStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
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<std::wstring>(traceList[i]) );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Py_XDECREF(errvalue);
|
Py_XDECREF(errvalue);
|
||||||
|
@ -7,64 +7,64 @@ import sys
|
|||||||
import re
|
import re
|
||||||
|
|
||||||
AccessMask = {
|
AccessMask = {
|
||||||
0x00010000 : 'DELETE',
|
0x00010000 : 'DELETE',
|
||||||
0x00020000 : 'READ_CONTROL',
|
0x00020000 : 'READ_CONTROL',
|
||||||
0x00040000 : 'WRITE_DAC',
|
0x00040000 : 'WRITE_DAC',
|
||||||
0x00080000 : 'WRITE_OWNER',
|
0x00080000 : 'WRITE_OWNER',
|
||||||
0x00100000 : 'SYNCHRONIZE',
|
0x00100000 : 'SYNCHRONIZE',
|
||||||
0x01000000 : 'ACCESS_SYSTEM_SECURITY',
|
0x01000000 : 'ACCESS_SYSTEM_SECURITY',
|
||||||
0x02000000 : 'MAXIMUM_ALLOWED'
|
0x02000000 : 'MAXIMUM_ALLOWED'
|
||||||
}
|
}
|
||||||
|
|
||||||
GenericMask = {
|
GenericMask = {
|
||||||
0x10000000 : 'GENERIC_ALL',
|
0x10000000 : 'GENERIC_ALL',
|
||||||
0x20000000 : 'GENERIC_EXECUTE',
|
0x20000000 : 'GENERIC_EXECUTE',
|
||||||
0x40000000 : 'GENERIC_WRITE',
|
0x40000000 : 'GENERIC_WRITE',
|
||||||
0x80000000 : 'GENERIC_READ'
|
0x80000000 : 'GENERIC_READ'
|
||||||
}
|
}
|
||||||
|
|
||||||
FileAccessMask = {
|
FileAccessMask = {
|
||||||
0x0001 : 'FILE_READ_DATA',
|
0x0001 : 'FILE_READ_DATA',
|
||||||
0x0002 : 'FILE_WRITE_DATA',
|
0x0002 : 'FILE_WRITE_DATA',
|
||||||
0x0004 : 'FILE_APPEND_DATA',
|
0x0004 : 'FILE_APPEND_DATA',
|
||||||
0x0008 : 'FILE_READ_EA',
|
0x0008 : 'FILE_READ_EA',
|
||||||
0x0010 : 'FILE_WRITE_EA',
|
0x0010 : 'FILE_WRITE_EA',
|
||||||
0x0020 : 'FILE_EXECUTE',
|
0x0020 : 'FILE_EXECUTE',
|
||||||
0x0040 : 'FILE_DELETE_CHILD',
|
0x0040 : 'FILE_DELETE_CHILD',
|
||||||
0x0080 : 'FILE_READ_ATTRIBUTES',
|
0x0080 : 'FILE_READ_ATTRIBUTES',
|
||||||
0x0100 : 'FILE_WRITE_ATTRIBUTES'
|
0x0100 : 'FILE_WRITE_ATTRIBUTES'
|
||||||
}
|
}
|
||||||
|
|
||||||
ProcessAccessMask = {
|
ProcessAccessMask = {
|
||||||
0x0001 : 'PROCESS_TERMINATE',
|
0x0001 : 'PROCESS_TERMINATE',
|
||||||
0x0002 : 'PROCESS_CREATE_THREAD',
|
0x0002 : 'PROCESS_CREATE_THREAD',
|
||||||
0x0004 : 'PROCESS_SET_SESSIONID',
|
0x0004 : 'PROCESS_SET_SESSIONID',
|
||||||
0x0008 : 'PROCESS_VM_OPERATION',
|
0x0008 : 'PROCESS_VM_OPERATION',
|
||||||
0x0010 : 'PROCESS_VM_READ',
|
0x0010 : 'PROCESS_VM_READ',
|
||||||
0x0020 : 'PROCESS_VM_WRITE',
|
0x0020 : 'PROCESS_VM_WRITE',
|
||||||
0x0040 : 'PROCESS_DUP_HANDLE',
|
0x0040 : 'PROCESS_DUP_HANDLE',
|
||||||
0x0080 : 'PROCESS_CREATE_PROCESS',
|
0x0080 : 'PROCESS_CREATE_PROCESS',
|
||||||
0x0100 : 'PROCESS_SET_QUOTA',
|
0x0100 : 'PROCESS_SET_QUOTA',
|
||||||
0x0200 : 'PROCESS_SET_INFORMATION',
|
0x0200 : 'PROCESS_SET_INFORMATION',
|
||||||
0x0400 : 'PROCESS_QUERY_INFORMATION',
|
0x0400 : 'PROCESS_QUERY_INFORMATION',
|
||||||
0x0800 : 'PROCESS_SUSPEND_RESUME',
|
0x0800 : 'PROCESS_SUSPEND_RESUME',
|
||||||
0x1000 : 'PROCESS_QUERY_LIMITED_INFORMATION'
|
0x1000 : 'PROCESS_QUERY_LIMITED_INFORMATION'
|
||||||
}
|
}
|
||||||
|
|
||||||
ThreadAccessMask = {
|
ThreadAccessMask = {
|
||||||
0x0001 : 'THREAD_TERMINATE',
|
0x0001 : 'THREAD_TERMINATE',
|
||||||
0x0002 : 'THREAD_SUSPEND_RESUME',
|
0x0002 : 'THREAD_SUSPEND_RESUME',
|
||||||
0x0004 : 'THREAD_ALERT',
|
0x0004 : 'THREAD_ALERT',
|
||||||
0x0008 : 'THREAD_GET_CONTEXT',
|
0x0008 : 'THREAD_GET_CONTEXT',
|
||||||
0x0010 : 'THREAD_SET_CONTEXT',
|
0x0010 : 'THREAD_SET_CONTEXT',
|
||||||
0x0020 : 'THREAD_SET_INFORMATION',
|
0x0020 : 'THREAD_SET_INFORMATION',
|
||||||
0x0040 : 'THREAD_QUERY_INFORMATION',
|
0x0040 : 'THREAD_QUERY_INFORMATION',
|
||||||
0x0080 : 'THREAD_SET_THREAD_TOKEN',
|
0x0080 : 'THREAD_SET_THREAD_TOKEN',
|
||||||
0x0100 : 'THREAD_IMPERSONATE',
|
0x0100 : 'THREAD_IMPERSONATE',
|
||||||
0x0200 : 'THREAD_DIRECT_IMPERSONATION',
|
0x0200 : 'THREAD_DIRECT_IMPERSONATION',
|
||||||
0x0400 : 'THREAD_SET_LIMITED_INFORMATION',
|
0x0400 : 'THREAD_SET_LIMITED_INFORMATION',
|
||||||
0x0800 : 'THREAD_QUERY_LIMITED_INFORMATION'
|
0x0800 : 'THREAD_QUERY_LIMITED_INFORMATION'
|
||||||
}
|
}
|
||||||
|
|
||||||
FileMaskSets = [FileAccessMask, AccessMask, GenericMask]
|
FileMaskSets = [FileAccessMask, AccessMask, GenericMask]
|
||||||
ProcessMaskSets = [ProcessAccessMask, AccessMask, GenericMask]
|
ProcessMaskSets = [ProcessAccessMask, AccessMask, GenericMask]
|
||||||
@ -72,43 +72,51 @@ ThreadMaskSets = [ThreadAccessMask, AccessMask, GenericMask]
|
|||||||
GenericMaskSets = [AccessMask, GenericMask]
|
GenericMaskSets = [AccessMask, GenericMask]
|
||||||
|
|
||||||
def parseMask(mask, maskSets) :
|
def parseMask(mask, maskSets) :
|
||||||
cnt = 0
|
cnt = 0
|
||||||
for i in range(0, 31) :
|
for i in range(0, 31) :
|
||||||
bit = 1 << i
|
bit = 1 << i
|
||||||
for maskSet in maskSets :
|
for maskSet in maskSets :
|
||||||
if (bit & mask) and bit in maskSet:
|
if (bit & mask) and bit in maskSet:
|
||||||
if (cnt != 0) :
|
if (cnt != 0) :
|
||||||
dprint(" | ")
|
dprint(" | ")
|
||||||
if (cnt % 4 == 0) :
|
if (cnt % 4 == 0) :
|
||||||
dprintln("")
|
dprintln("")
|
||||||
dprint("" + maskSet[bit])
|
dprint("" + maskSet[bit])
|
||||||
mask &= ~bit
|
mask &= ~bit
|
||||||
cnt += 1
|
cnt += 1
|
||||||
return mask
|
return mask
|
||||||
|
|
||||||
argc = len(sys.argv)
|
def main():
|
||||||
|
|
||||||
if argc == 1 :
|
argc = len(sys.argv)
|
||||||
dprintln("Syntax: [object type] <;hex mask>;")
|
|
||||||
dprintln("Supported object types: process, thread, file, generic")
|
|
||||||
quit( 0 )
|
|
||||||
|
|
||||||
type = (argc > 2 and sys.argv[1]) or "generic"
|
0/0
|
||||||
if argc > 2 :
|
|
||||||
mask = int(sys.argv[2], 16)
|
|
||||||
else :
|
|
||||||
mask = int(sys.argv[1], 16)
|
|
||||||
|
|
||||||
if type == "file" :
|
if argc == 1 :
|
||||||
mask = parseMask(mask, FileMaskSets)
|
dprintln("Syntax: [object type] <;hex mask>;")
|
||||||
elif type == "process" :
|
dprintln("Supported object types: process, thread, file, generic")
|
||||||
mask = parseMask(mask, ProcessMaskSets)
|
return
|
||||||
elif type == "thread" :
|
|
||||||
mask = parseMask(mask, ThreadMaskSets)
|
|
||||||
elif type == "generic" :
|
|
||||||
mask = parseMask(mask, GenericMaskSets)
|
|
||||||
|
|
||||||
dprintln("")
|
type = (argc > 2 and sys.argv[1]) or "generic"
|
||||||
|
if argc > 2 :
|
||||||
|
mask = int(sys.argv[2], 16)
|
||||||
|
else :
|
||||||
|
mask = int(sys.argv[1], 16)
|
||||||
|
|
||||||
|
if type == "file" :
|
||||||
|
mask = parseMask(mask, FileMaskSets)
|
||||||
|
if type == "process" :
|
||||||
|
mask = parseMask(mask, ProcessMaskSets)
|
||||||
|
if type == "thread" :
|
||||||
|
mask = parseMask(mask, ThreadMaskSets)
|
||||||
|
elif type == "generic" :
|
||||||
|
mask = parseMask(mask, GenericMaskSets)
|
||||||
|
|
||||||
|
dprintln("")
|
||||||
|
|
||||||
|
if mask != 0 :
|
||||||
|
dprintln("Unknown bits: 0x%x" % mask)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
||||||
if mask != 0 :
|
|
||||||
dprintln("Unknown bits: 0x%x" % mask)
|
|
||||||
|
Loading…
Reference in New Issue
Block a user