Merge branch 'master' of https://github.com/AuroraWright/Luma3DS
This commit is contained in:
commit
7f314dfe11
@ -24,7 +24,7 @@
|
|||||||
__author__ = "TuxSH"
|
__author__ = "TuxSH"
|
||||||
__copyright__ = "Copyright (c) 2016 TuxSH"
|
__copyright__ = "Copyright (c) 2016 TuxSH"
|
||||||
__license__ = "GPLv3"
|
__license__ = "GPLv3"
|
||||||
__version__ = "v1.0"
|
__version__ = "v1.2"
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Parses Luma3DS exception dumps
|
Parses Luma3DS exception dumps
|
||||||
@ -33,6 +33,9 @@ Parses Luma3DS exception dumps
|
|||||||
import argparse
|
import argparse
|
||||||
from struct import unpack_from
|
from struct import unpack_from
|
||||||
|
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
|
||||||
# Source of hexdump: https://gist.github.com/ImmortalPC/c340564823f283fe530b
|
# Source of hexdump: https://gist.github.com/ImmortalPC/c340564823f283fe530b
|
||||||
# Credits for hexdump go to the original authors
|
# Credits for hexdump go to the original authors
|
||||||
# Slightly edited by TuxSH
|
# Slightly edited by TuxSH
|
||||||
@ -76,7 +79,7 @@ def hexdump(addr, src, length=16, sep='.' ):
|
|||||||
text += chr(c)
|
text += chr(c)
|
||||||
else:
|
else:
|
||||||
text += sep
|
text += sep
|
||||||
result.append(('%08X: %-'+str(length*(2+1)+1)+'s |%s|') % (addr + i, hexa, text))
|
result.append(('%08x: %-'+str(length*(2+1)+1)+'s |%s|') % (addr + i, hexa, text))
|
||||||
|
|
||||||
return '\n'.join(result)
|
return '\n'.join(result)
|
||||||
|
|
||||||
@ -104,8 +107,9 @@ if __name__ == "__main__":
|
|||||||
raise SystemExit("Incompatible format version, please use the appropriate parser.")
|
raise SystemExit("Incompatible format version, please use the appropriate parser.")
|
||||||
|
|
||||||
registers = unpack_from("<{0}I".format(nbRegisters), data, 40)
|
registers = unpack_from("<{0}I".format(nbRegisters), data, 40)
|
||||||
codeDump = data[40 + 4 * nbRegisters : 40 + 4 * nbRegisters + codeDumpSize]
|
codeOffset = 40 + 4 * nbRegisters
|
||||||
stackOffset = 40 + 4 * nbRegisters + codeDumpSize
|
codeDump = data[codeOffset : codeOffset + codeDumpSize]
|
||||||
|
stackOffset = codeOffset + codeDumpSize
|
||||||
stackDump = data[stackOffset : stackOffset + stackDumpSize]
|
stackDump = data[stackOffset : stackOffset + stackDumpSize]
|
||||||
addtionalDataOffset = stackOffset + stackDumpSize
|
addtionalDataOffset = stackOffset + stackDumpSize
|
||||||
additionalData = data[addtionalDataOffset : addtionalDataOffset + additionalDataSize]
|
additionalData = data[addtionalDataOffset : addtionalDataOffset + additionalDataSize]
|
||||||
@ -139,9 +143,27 @@ if __name__ == "__main__":
|
|||||||
print(makeRegisterLine(registerNames[i], registers[i], registerNames[i+1], registers[i+1]))
|
print(makeRegisterLine(registerNames[i], registers[i], registerNames[i+1], registers[i+1]))
|
||||||
if nbRegisters % 2 == 1: print("{0:<15}{1:<20}".format(registerNames[nbRegisters - 1], "{0:08x}".format(registers[nbRegisters - 1])))
|
if nbRegisters % 2 == 1: print("{0:<15}{1:<20}".format(registerNames[nbRegisters - 1], "{0:08x}".format(registers[nbRegisters - 1])))
|
||||||
|
|
||||||
|
thumb = registers[16] & 0x20 != 0
|
||||||
|
addr = registers[15] - codeDumpSize + (2 if thumb else 4)
|
||||||
|
|
||||||
print("\nCode dump:\n")
|
print("\nCode dump:\n")
|
||||||
print(hexdump(registers[15] - codeDumpSize + (4 if (registers[16] & 0x20 == 0) else 2), codeDump))
|
|
||||||
|
objdump_res = ""
|
||||||
|
try:
|
||||||
|
path = os.path.join(os.environ["DEVKITARM"], "bin", "arm-none-eabi-objdump")
|
||||||
|
if os.name == "nt":
|
||||||
|
path = ''.join((path[1], ':', path[2:])).replace('/', '\\')
|
||||||
|
|
||||||
|
objdump_res = subprocess.check_output((
|
||||||
|
path, "-marm", "-b", "binary",
|
||||||
|
"--adjust-vma="+hex(addr - codeOffset), "--start-address="+hex(addr),
|
||||||
|
"--stop-address="+hex(addr + codeDumpSize), "-D", "-z", "-M",
|
||||||
|
"reg-names-std" + (",force-thumb" if thumb else ""), args.filename
|
||||||
|
)).decode("utf-8")
|
||||||
|
objdump_res = '\n'.join(objdump_res[objdump_res.find('<.data+'):].split('\n')[1:])
|
||||||
|
except: objdump_res = ""
|
||||||
|
|
||||||
|
print(objdump_res if objdump_res != "" else hexdump(addr, codeDump))
|
||||||
|
|
||||||
print("\nStack dump:\n")
|
print("\nStack dump:\n")
|
||||||
print(hexdump(registers[13], stackDump))
|
print(hexdump(registers[13], stackDump))
|
||||||
|
|
Reference in New Issue
Block a user