HotSpot Error ID decode script

HotSpot JVM クラッシュ時に Error ID: に続いて、長いヘキサの文字列が出てくることがある。これはエラーの起きたファイル名と行番号をエンコードしたもので、ファイル名部分は文字のアスキーコード値-0x20の列で、その後に16進の行番号が続く。ファイル名部分と行番号部分に明確なデリミタがないので、判断が難しい。

もっとも、可能性のある .[hc]pp, .[hc] などが現れたらファイル名は終わったと判断してもよいのかもしれない。


bash-3.00$ cat decode_error_id.py
#!/usr/bin/env python

def decode_id(idstr):
""" Decode Error ID in HotSpot JVM crash message
"""
if isinstance(idstr, str):
import re
tmps = ''
lineno = -1
reo = re.compile("[0-9a-zA-Z\.]")
for i in range(len(idstr)/2):
cs = idstr[i*2:i*2+2]
#print cs
csv = int(cs, 16) + 32
csvc = chr(csv)

if reo.match(csvc):
tmps += csvc
else:
lns = idstr[i*2:]
lnv = int(lns, 16)
lineno = lnv
return tmps + ":" + str(lineno)
# print "%x " % csv
else:
print "E: decode_id non-string param was passed."
return "error"

def showHelp():
msg = """Usage: [python] decode_error_id.py
e.g. 4F530E43505002EF
"""
print msg

def doDemo():
tid = "4F530E43505002EF"
print "%s -> %s" % (tid, decode_id(tid))

if __name__ == '__main__':
import sys
import getopt

optlist, args = getopt.getopt(sys.argv[1:], 'h')

for otup in optlist:
if otup[0] == '-h':
showHelp()
doDemo()
sys.exit(0)

if len(args) == 0:
showHelp()
doDemo()
sys.exit(0)
else:
for tid in args:
print "%s -> %s" % (tid, decode_id(tid))