Jython スクリプトの作成

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

これらは、デバッガの Jython スクリプトを作成するために必要な重要な概念です。

インポート

デバッガモジュールには、レジスタやメモリなどにアクセスするための、サービスと呼ばれるクラスと共に、DS-5 デバッガへの初期アクセスのたのデバッガクラスが用意されています。 以下の例は、一般に Jython スクリプトの上位に置かれるモジュールインポートの完全なセットを示しています。

from arm_ds.debugger_v1 import Debugger
from arm_ds.debugger_v1 import DebugException
実行コンテキスト

DS-5 デバッガの Jython インタフェースで実行するほとんどの操作には、例外コンテキストが必要です。 実行コンテキストは、ターゲットシステム状態を表します。 デバッガでアクセス可能なプロセス、スレッド、プロセッサごとに個別の実行コンテキストが存在します。 例えば、デバッガラスのインスタンスから実行コンテキストを取得できます。

# 最初の実行コンテキストを取得
debugger = Debugger()
ec = debugger.getExecutionContext(0)
レジスタ

デバッガの Jython インタフェースを使用して、プロセッサレジスタ、コプロセッサレジスタ、および周辺レジスタにアクセスできます。 レジスタアクセスするには、その名前に関する情報が必要です。 名前は、グラフィカルデバッガの[レジスタ]ビューから取得できます。 RegisterService 使用すると、特定の実行コンテキストでレジスタ値の読み取りと書き込みを行うことができます。以下に例を示します。

# 実行コンテキスト ec からプログラムカウンタ(PC)を出力
value = ec.getRegisterService().getValue('PC')
print 'The PC is %s' %value
メモリ

デバッガの Jython インタフェースを使用してメモリにアクセスできます。 アクセスするアドレスとバイト数を指定する必要があります。 アドレスとサイズは、指定された実行コンテキスト内で評価される式を含んでいる絶対値または文字列にすることができます。 以下に例を示します。

# 実行コンテキスト ec からアドレス 0x0 で 16 バイトを出力
print ec.getMemoryService().read(0x0, 16)
DS コマンド

デバッガの Jython インタフェースを使用して、任意の DS-5 コマンドを実行できます。 これは、必要な機能が Jython インタフェースでは直接提供さていない場合に役立ちます。 実行コンテキストと、実行するコマンドおよび引数を指定する必要があります。 戻り値には、戻り値には、コマンからのテキスト出力およびエラー(ある場合)が含まれます。 以下に例を示します。

# DS-5 コマンド 'print $ENTRYPOINT' を実行し、結果を出力
print ec.executeDSCommand('print $ENTRYPOINT')
エラー処理

デバッガの Jython インタフェースのメソッドでは、エラーが発生すると、DebugException がスローされます。 詳細を出力するために、例外をキャッチてエラーを処理できます。 以下に例を示します。

# DebugException をキャッチし、エラーメッセージを出力
try:
  ec.getRegisterService().getValue('ThisRegisterDoesNotExist')
except DebugException, de:
  print "Caught DebugException: %s" % (de.getMessage())

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

Example 8. Jython スクリプト

# ファイル名: myScript.py

import sys

from arm_ds.debugger_v1 import Debugger
from arm_ds.debugger_v1 import DebugException

# デバッガにアクセスするためのデバッガオブジェクト
debugger = Debugger()

# 初期化コマンド
ec = debugger.getExecutionContext(0)
ec.getExecutionService().stop()
ec.getExecutionService().waitForStop()
# 実行コンテキストリファレンスが古い場合
ec = debugger.getExecutionContext(0)
# スクリプト引数で指定されている場合にイメージをロード
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")
    # 出力例:
    # エントリポイント: $8 = 32768
else:
    pass # イメージとシンボルがロードされることを前提とする

# メインにテンポラリブレークポイントを設定して再開
ec.getExecutionService().resumeTo("main") # この方法はノンブロック
try:
    ec.getExecutionService().waitForStop(500) # 500ms 待機

except DebugException, e:
    if e.getErrorCode() == "JYI31": # "Wait for stop timed out" メッセージのコード
        print "Waiting timed out!"
        sys.exit()
    else:
        raise # 別のエラーの場合は例外を発生させる
ec = debugger.getExecutionContext(0)

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)
# 出力:
#         識別子: 1、レジスタ: Core::R0 = 0x00000010 (16), Core::R1 = 0x00000000 (0), Core::R2 = 0x0000A4A4 (42148)
#         ...

Show/hide関連項目

Copyright © 2010-2012 ARM. All rights reserved.ARM DUI 0446IJ
Non-ConfidentialID051512