C ++アプリケーションに埋め込まれたluaコードをどのようにデバッグしますか?
私が収集したものから、特別なIDEを購入し、特別なluaランタイムにリンクする必要があります(ugh)。または、lua debug API呼び出しを使用して、ゲームエンジンにデバッグコンソールを組み込む必要があります。
私は自分のデバッグコンソールを書くことに傾倒していますが、それは大変な作業のようです。ゲームの他の部分を磨くのに費やしたほうがいい時間。
C ++アプリケーションに埋め込まれたluaコードをどのようにデバッグしますか?
私が収集したものから、特別なIDEを購入し、特別なluaランタイムにリンクする必要があります(ugh)。または、lua debug API呼び出しを使用して、ゲームエンジンにデバッグコンソールを組み込む必要があります。
私は自分のデバッグコンソールを書くことに傾倒していますが、それは大変な作業のようです。ゲームの他の部分を磨くのに費やしたほうがいい時間。
あなたが望むことの少なくとも一部を行うことができるいくつかのツールが浮かんでいます。VSプラグインへの参照を見てきました。LuaforWindowsにはSciTEデバッガー拡張機能があり、KeplerプロジェクトのRemDebugとLuaEclipseがあります。
RemDebugは、Luaで記述されたCGIスクリプトのデバッグを可能にするために構築されているため、必要なものを順調に進めている可能性があります。ターゲットスクリプトとコントローラー、および他のいくつかのモジュール間の通信チャネルを提供するには、LuaSocketモジュールにアクセスする必要があります。
より大きな問題は、ゲームエンジンがスクリプトの周りに置いたサンドボックス内から任意のモジュールをロードする機能である可能性があります。エンジンをある程度制御できる場合、それはそれほど大きな問題にはなりません。
たとえば、Lightroomはrequire
プラグインのサンドボックス内に公開されていないため、これは現在AdobeLightroomプラグインの開発者には不可能です。
私が驚いたのは、Luaで作業するときにデバッガーの必要性を感じることはめったにないことです。私はさまざまなプロジェクトのためにいくつかの小さなアプリケーションを構築しましたが、完全なスタックバックトレースと時折の呼び出しの組み合わせが、そもそも防止できなかっprint
たバグを見つけるためにどれほどうまく機能するかに驚いています。require "strict"
デコダはどうですか?それを使用する方法を説明するビデオがあります、そしてそれは埋め込まれたluaソースのためにかなりうまく機能します。(私は幸せな顧客です)。そしてそれはかなり安いです。
私のデバッガーを使用できます:GRLD(グラフィカルリモートluaデバッガー)。RemDebugと同様に、ソケット接続を使用しますが、RemDebugとは異なり、優れたグラフィカルインターフェイスを備えています。ソースコードが提供されているので、どのプラットフォームでも動作させることができます。標準のluaランタイムで動作します。非営利目的の使用は無料です。
編集:申し訳ありませんが、ウェブサイトを閉じる必要があったため、ソフトウェアをダウンロードできなくなりました。時間があれば、後でオープンソースソフトウェアとしてリリースするかもしれません。
編集2:リンクが更新され、MITライセンス(オープンソース)の下でgithubでホストされるようになりました
既存のコンソールの1つから始めたい場合があるため、独自のコンソールを作成する必要はありません。RemDebugはすでに提案されています。私はRemDebugに基づくデバッガーであるMobDebugを開発してきましたが、多くの新機能とバグ修正が含まれています。変更の詳細なリストは、READMEにあります。
スクリプトでデバッグを有効にするのは、追加するのと同じくらい簡単require('mobdebug').start()
です(アプリとデバッガーサーバーを同じマシンで実行している場合)。これは、ローカルホストのデフォルトポートでリッスンしているデバッガーに接続しようとする必要があります。MobDebugに含まれているコマンドラインインターフェイスを使用することも、 MobDebugと統合してデバッグ機能を提供するLuaIDEであるZeroBraneStudioを使用することもできます。IDEは、Love2d、Moai、およびその他のLuaエンジンのデバッグをサポートしており、セットアップでも機能する可能性があります。
DebuggerBreakの呼び出しがどのように機能するかわかりません。これは、.NET固有であるためです。私は、CLRをターゲットとするフォークされたLuaでのみ機能すると思います。
標準のLuaを使用している場合は、lua関数呼び出しdebug.debug()を介していくつかの基本的なデバッグ機能があります。これにより、Luaがコンソールにスローされるため、コンソールからluaを実行している場合は、luaコマンドをインタラクティブに発行して、現在の状態を検査できるはずです。debug.debug()は現在のスタックフレームに入らないため、debug.getlocal()を使用して変数の値を読み取る必要があります。
まだ自分で試したことはありませんが、実際に自分で実行可能なデバッグコンソールを作成するのはそれほど大変な作業ではないと思います。LuaはC++ほど複雑な言語ではないため、gdbなどの実際のC++デバッガーを作成するよりもはるかに簡単です。
すでに同じようなことをした人はたくさんいると思います。あなたが見ることができるコードは誰ですか。これはluaのみで記述されたCLIデバッガーです。たった1つのluaファイル。使いすぎて、ニーズに合わせて変更するべきではありません。
WindowsとVSを使用している場合-私たちが使用しているトリックを使用できますか?
luaコードをファイルにコピーします。次に、luaコードでDebugger apiを呼び出します(C ++ではこれはDebuggerBreak()
私が思うに-ここを参照してください)。その後、luaコードが実行されると、デバッガーが起動し、ファイルを指定できるようになります。次に、通常どおりにデバッグしますか?