7.5 Jython スクリプトについて

Jython は、Java で実装された Python スクリプト言語です。これによって、データ型、条件付き実行、ループ、および、関数、クラス、モジュールへのコードの構成が包括的にサポートされるだけでなく、標準的な Jython ライブラリへのアクセスも可能になります。

Jython は、より大きなスクリプトや複雑なスクリプトを実行する場合に最適な言語です。これらは、デバッガの Jython スクリプトを作成するために必要な重要な概念です。

スクリプトの種類を区別するため、.py ファイル拡張子を使用する必要があります。

# Filename: myScript.py
import sys
from arm_ds.debugger_v1 import Debugger
from arm_ds.debugger_v1 import DebugException
# デバッガにアクセスするためのデバッガオブジェクト
debugger = Debugger()
# 初期化コマンド
ec = debugger.getCurrentExecutionContext()
ec.getExecutionService().stop()
ec.getExecutionService().waitForStop()
# 実行コンテキストリファレンスが古い場合
ec = debugger.getCurrentExecutionContext()
# スクリプト引数で指定されている場合にイメージをロード
if len(sys.argv) == 2:
    image = sys.argv[1]
    ec.getImageService().loadImage(image)
    ec.getExecutionService().setExecutionAddressToEntryPoint()
    ec.getImageService().loadSymbols(image)
    # 使用可能なすべての DS コマンドが使用できる
    print "Entry point: ",
    print ec.executeDSCommand("print $ENTRYPOINT")
    # 出力例:
    #         Entry point: $8 = 32768
else:
    pass # イメージとシンボルがロードされることを前提とする
# メインにテンポラリブレークポイントを設定して再開
ec.getExecutionService().resumeTo("main") # この方法はノンブロック
try:
    ec.getExecutionService().waitForStop(500) # 500ms 待機
except DebugException, e:
    if e.getErrorCode() == "JYI31": # code of "Wait for stop timed out" message
        print "Waiting timed out!"
        sys.exit()
    else:
        raise # 別のエラーの場合は例外を発生させる
ec = debugger.getCurrentExecutionContext()
def getRegisterValue(executionContext, name):
    """レジスタ値を取得し、符号なし 16 進数および符合付き整数と共に文字列を返します。
    レジスタの読み取りで問題が発生した場合は、文字列 "error" を返す可能性が
    あります。
    """
    try:
        value = executionContext.getRegisterService().getValue(name)
        # 戻り値は数値型のように動作し、
        # バイトの配列のようにアクセス可能(例:'print value[:]')
        return "%s (%d)" % (str(value), int(value))
    except DebugException, e:
        return "error"
# すべての実行コンテキストでコアレジスタを出力
for i in range(debugger.getExecutionContextCount()):
    ec = debugger.getExecutionContext(i)
    # "Core::" で始まるレジスタ名をフィルタ
    coreRegisterNames = filter(lambda name: name.startswith("Core::"),
                            ec.getRegisterService().getRegisterNames())
    # Jython 包括リストを使用して、これらのすべてのレジスタの値を取得
    registerInfo = ["%s = %s" % (name, getRegisterValue(ec, name))
                                        for name in coreRegisterNames]
    registers = ", ".join(registerInfo[:3]) # 最初の 3 つのみ
    print "Identifier: %s, Registers: %s" % (ec.getIdentifier(), registers)
# 出力:
#         Identifier: 1, Registers: Core::R0 = 0x00000010 (16), Core::R1 = 0x00000000 (0), Core::R2 = 0x0000A4A4 (42148)
#         ...
非機密扱いPDF file icon PDF 版ARM DUI0446ZJ
Copyright © 2010–2016 ARM.All rights reserved.