CSplusのdebuggerを外部から制御すること(operation from external Python 3)を試してみようと思います

こんにちは。NoMaYです。

CS+ V8.09.00のリリースノートに以下の記載がありました。試してみようかと思います。(デバッガも制御出来るのかな?)

CS+ for CC V8.09.00 リリースノート
R20UT5230JJ0100 Rev.1.00 2022.12.01
www.renesas.com/jp/ja/document/rln/cs-cc-v80900-release-note#page=6

4.3 Python コンソールの機能改善

4.3.1 Python 3 実行環境との外部通信機能の追加

Python 3.x からCS+を制御する機能を追加しました。


[関連リンク]

統合開発環境 CS+ 製品ページ
www.renesas.com/jp/ja/software-tool/cs
 

  • こんにちは。NoMaYです。

    Python 3 実行環境との外部通信機能のヘルプは以下にありました。デバッグ向け機能しかありませんでしたね。とはいえ、ブレークポイントの設定/削除といった機能は見当たりませんね。

    top > Pythonコンソール編 > Python 3実行環境との外部通信機能/csplusモジュール関数
    tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V8.09.00/CS+.chm/PythonConsole.chm/Output/py_Python_socket1-nav-1.html

    C. Python 3実行環境との外部通信機能/csplusモジュール関数

    ここでは,Python 3実行環境との外部通信機能で使用するcsplusモジュールの関数について説明します。

    表 C.12    csplus モジュール関数

    関数名 機能概要
    csplus.connect Python 3 実行環境とCS+のソケット通信を確立します。
    csplus.download_loadmodule ロードモジュールファイルをダウンロードします。
    csplus.get_register 指定されたレジスターの値を取得します。
    csplus.get_symbol_address 指定されたシンボルに対応するアドレスを取得します。
    csplus.is_debug_session_running プログラムが実行中かどうかを調べます。
    csplus.launch_debug_session デバッグセッションを開始します。
    csplus.read_memory 指定されたアドレスから値を読み出します。
    csplus.reset_debug_session 指定されたデバッグセッションでリセットを実行します。
    csplus.resume_debug_session 指定されたデバッグセッションでresumeを実行します。
    csplus.step_in 指定されたデバッグセッションでステップ実行を行います。
    csplus.suspend_debug_session 指定されたデバッグセッションで実行の中断を行います。
    csplus.terminate CS+との通信を切断し,CS+を終了します。
    csplus.terminate_debug_session 指定したデバッグセッションを切断します。
    csplus.write_memory 指定されたアドレスに指定された値を書き込みます。



  • こんにちは。NoMaYです。

    以下のヘルプによると、Python 3 実行環境側からCS+へ以下の使用例のようにしてソケット通信を確立するようです。

    top > Pythonコンソール編 > Python 3実行環境との外部通信機能/csplusモジュール関数 > csplus.connect
    tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V8.09.00/CS+.chm/PythonConsole.chm/Output/py_Python_socket2-nav-1.html

    [使用例]

    >>> import sys
    >>> sys.path.append("C:\Program Files (x86)\Renesas Electronics\CS+\CC\Plugins\PythonConsole\integration_service")
    >>> import csplus
    >>> csplus.connect()
    >>>



    この時にPython 3 実行環境側で読み込まれるソースは以下の場所にあります。

    <CS+インストールフォルダ>\CC\Plugins\PythonConsole\integration_service\

    csplus.py
    isserver\control_status_socket.py
    isserver\csplus_server.py
    isserver\csplus_socket.py
    isserver\__init__.py

     
    興味深いのは、経緯は分かりませんけれども、e2 studioにも同様のソースがあることです。e2 studio自身のintegration service機能の為に何かしらのソースがあることは分かりますけれども、好奇心として、なぜ csplus というフォルダ名にソースがあったり、かつソース中にも csplus の文字列があったり、といったところとか、ちょっと気になるところです。

    <e2 studio 2023-04サポートフォルダ>\.eclipse\com.renesas.platform_<識別番号>\Utilities\integration_service\

    e2studio.py
    csplus\after_trace_memory_full.py
    csplus\breakpoint_info.py
    csplus\break_condition.py
    csplus\break_type.py
    csplus\build.py
    csplus\build_compile.py
    csplus\build_link.py
    csplus\common.py
    csplus\compiler.py
    csplus\debugger.py
    csplus\debugger_breakpoint.py
    csplus\debugger_debugtool.py
    csplus\debugger_download.py
    csplus\debugger_memory.py
    csplus\debugger_option.py
    csplus\debugger_watch.py
    csplus\debug_tool.py
    csplus\download_option.py
    csplus\encoding.py
    csplus\go_option.py
    csplus\memory_option.py
    csplus\micom_type.py
    csplus\project.py
    csplus\project_file.py
    csplus\project_kind.py
    csplus\step_option.py
    csplus\trace_priority.py
    csplus\utility.py
    csplus\vendor_type.py
    csplus\watch_option.py
    csplus\xtime_info.py
    csplus\__init__.py
    isserver\control_status_socket.py
    isserver\e2studio_server.py
    isserver\e2studio_socket.py
    isserver\__init__.py

     

  • こんにちは。NoMaYです。

    まだCS+インストールフォルダの下のソースをがっつりとは見ていませんけれども、ソケット通信ということで、原理的に考えれば以下のようなことも出来そうな気がしなくも無いです。(ソースの修正や移植が必要になるでしょうけれども。)

    (1) 別のパソコンからCS+に接続する
    (2) Windows以外にもLinuxやMacOSからCS+に接続する
    (3) Python 3以外のスクリプト言語やC/C++/C#/VisualBasicといった言語のコンパイラで作成したプログラムからCS+に接続する

  • こんにちは。NoMaYです。

    いざやってみるとうまくいきません。ファイアウォールとかの事情でしょうか、、、もう少しやってみます、、、

    Python 3.11.4 (tags/v3.11.4:d2340ef, Jun  7 2023, 05:45:37) [MSC v.1934 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys
    >>> sys.path.append("C:\Renesas\CS+\CC\Plugins\PythonConsole\integration_service")
    >>> import csplus
    >>> csplus.connect()
    Exception in thread Thread-1 (run_thread):
    Traceback (most recent call last):
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\Renesas2\Python311\Lib\threading.py", line 1038, in _bootstrap_inner
      File "C:\Renesas\CS+\CC\Plugins\PythonConsole\integration_service\csplus.py", line 13, in connect
        self.run()
      File "C:\Renesas2\Python311\Lib\threading.py", line 975, in run
        csplus.connect()
        self._target(*self._args, **self._kwargs)
      File "C:\Renesas\CS+\CC\Plugins\PythonConsole\integration_service\isserver\csplus_socket.py", line 50, in run_thread
      File "C:\Renesas\CS+\CC\Plugins\PythonConsole\integration_service\isserver\csplus_server.py", line 32, in connect
        csplus_socket.connect((CSPLUS_IP_ADDR, int(csplus_port_no)))
        csplus_socket.connect(get_csplus_port_no())
    ConnectionRefusedError: [WinError 10061] 対象のコンピューターによって拒否されたため、接続できませんでした。
      File "C:\Renesas\CS+\CC\Plugins\PythonConsole\integration_service\isserver\csplus_socket.py", line 34, in connect
        raise Exception("CS+ Server Socket handshake failed")
    Exception: CS+ Server Socket handshake failed
    >>>

     

  • こんにちは。NoMaYです。

    やっと気付いたのですけれども、CS+でPythonコンソールを開くと、コンソールのタブとサンプルスクリプトのタブの2つのタブが表示されて、そのサンプルスクリプトのタブの方に以下のドキュメントがあり、それに気付かないと、追加で必要なPythonコンポーネントがあることとか、全然分かんないですね、、、


    Python 3.x でCS+を制御する(技術プレビュー)

    Python 3.xでCS+を制御する方法を技術プレビューとして紹介します。

    はじめに

    CS+は、IronPython 2.7によるPython実行環境を提供していますが、多くのPython実行環境はPython 3.xに移行しています。
    弊社では将来のCS+でPython 3.xの実行環境を提供することを検討していますが、正式機能としての提供に先立ち、技術プレビューとしてPython 3.xでCS+を制御する方法を紹介します。

    概要

    開発中の非公式機能としてCS+に搭載されている、外部通信機能を用いてPython 3.xからCS+を制御します。
    本サンプルは技術プレビューであり、正式な機能ではありません。以下の点にご注意ください。
    •外部通信機能の動作は開発中であり無保証です。
    •外部通信機能を正式機能として提供することを検討しておりますが、現在とは異なる実装・仕様となる可能性があります。

    CS+の外部通信機能の実行環境は以下の通りです。CS+がサーバとなり、クライアント側から外部通信用ライブラリを実行してCS+と通信します。

    。。。以下省略。。。


  • こんにちは。NoMaYです。

    と思ったら、その先に以下の記載があって、単に今まで気付いていなかった昔のドキュメントの残骸なのかも知れません。


    外部通信用ライブラリは下記に格納されています。(デフォルトのインストール先)

    C:\Program Files (x86)\Renesas Electronics\CS+\CC\Plugins\PythonConsole

    外部通信機能の実行環境は.NET Framework 4.5.2以降です。Python 3.xで実行するためにPython.NETを使用します。
    そのため、Python.NETがサポートする Python 3.5から3.8までが本サンプルのPython 3.x実行環境となります。(2021年12月時点)
    また、外部通信用ライブラリは32bitプロセスでの動作が前提となっているため、32bit版のPythonを使用します。

    。。。以下省略。。。


    [追記]

    さすがに自分の恥を晒すことになってしまいますけれども、ドキュメントの最後に以下の日付がありましたね、、、



    2022/01/20



  • こんにちは。NoMaYです。

    元の設定に戻しても動作しました。記憶を辿ると、CS+側で実行するserver.Start()をserver.Startと打ち間違えたのかも。
    以下のエラーメッセージをGoogle検索して調べていったところ、私の場合には、以下のブログ記事のやり方で動作させることが出来るようになりました。(そして、私の場合には、Windowsを再起動した後に、でした。)

    [WinError 10061] 対象のコンピューターによって拒否されたため、接続できませんでした。

     
    「対象のコンピューターによって拒否されたため、接続できませんでした」VisualStudioのclient.Connectのlocalhost 80でエラー出たときの対処法 - 文系エンジニアが生き残るためのサイト
    selife5.com/visualstudio-localhost80-error/
     

  • こんにちは。NoMaYです。

    VSCodeのPython拡張機能をインストールして、VSCodeでスクリプトを書いてVSCodeで実行させて、CS+に接続してみました。インストール方法は以下のQiita記事を参考にしました。

    Windows端末にVS CodeでPython開発環境を用意してみる
    qiita.com/SAITO_Keita/items/ddcde4fdcdf5e5eaa933

    [追記]

    Google検索: VSCode Python 環境 構築 site:qiita.com
    www.google.com/search?q=VSCode+Python+環境+構築+site:qiita.com

    [ここまで追記]

    以下、VSCodeとCS+の画面コピーです。

    import sys
    sys.path.append("C:\Renesas\CS+\CC\Plugins\PythonConsole\integration_service")
    import csplus
    csplus.connect()
    csplus.launch_debug_session("DefaultBuild")
    csplus.download_loadmodule("0")
    pc = csplus.get_register("0", "pc")
    print(hex(pc))
    csplus.reset_debug_session("0")
    pc = csplus.get_register("0", "pc")
    print(hex(pc))

     
    なお、CS+のプロジェクトフォルダでは、以下のPythonコンソールスクリプトを置いて、プロジェクト読み込み時に自動実行
    されるようにしています。

    <mtpjプロジェクトファイルベース名>.py

    print("Restarting server...")
    print("server.Stop()")
    server.Stop()
    print("server.Start()")
    server.Start()

     

     

  • こんにちは。NoMaYです。

    VSCodeのSerial Monitor拡張機能にソケット通信機能がありましたので、インストールして、以下のCS+のPythonコンソールスクリプトを作成して、試してみました。(スクリプトはCS+のプロジェクトフォルダに置いて、プロジェクト読み込み時に自動実行されるようにしています。なお、Python 3スクリプトとは関係は無くて、かつ、制御する側では無くて、制御される側となるCS+のPythonコンソールスクリプトです。あと、概念確認をしたかったという程度の、エラーチェック無し版です。)

    Serial Monitor
    marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-serial-monitor
    learn.microsoft.com/en-us/cpp/embedded/serial-monitor?tabs=visual-studio-code

    <mtpjプロジェクトファイルベース名>.py

    import socket
    # Bind the socket to any IP address and the specified port
    HOST = ''
    PORT = 60916
    # Create a socket for listening incoming connection requests
    listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
    # Bind the socket to the specified IP address and port
    listen_socket.bind((HOST, PORT))
    # Set the socket in listen mode
    listen_socket.listen(1)
    # Accept the connection
    conn, address = listen_socket.accept()
    while 1:
        # Receive command to CS+
        command = conn.recv(2048)
        if not command:
            break
        print "RECV: " , repr(command)
        result = repr(eval(command)) + "\n"
        print "SEND: " , result
        # Send response from CS+
        conn.send(result)
    conn.close()
    listen_socket.close()

    # IronPython https://ironpython.net/documentation/

     
    以下、VSCodeとCS+の画面コピーです。




     

  • こんにちは。NoMaYです。

    そういえば、MATLAB/SimulinkからCS+を制御するとかしていましたね。

    MATLAB/SimulinkとEmbedded Target for Renesas CS+がRXとRL78に対応していましたね
    community-ja.renesas.com/cafe_rene/forums-groups/tools/f/forum21/7654/matlab-simulink-embedded-target-for-renesas-cs-rx-rl78