スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--.--.-- | スポンサー広告

[Lua] RemDebugへの長い長い道のり

現在進行中のプロジェクトで、Luaコードのデバッガを準備しておきたくなり、
いろいろやってみましたが・・・それは苦難の道のりでした。

これは自前のexeにカスタムLuaをリンクしている場合のお話です。


LuaEdit2.5.1を試してみた

アプリ組み込みではなく、luaそのままのデバッグではまあまあ好感触のLuaEditでしたが、
組み込みではどうでしょうか。

パッケージにLuaEditDebug.dll というDLLがついており、これをリンクして、
アプリ側でLuaEditDebugOpenという関数からLua_Stateを取得し、
LuaEditDebugStartFile等を呼べばLuaEditのウィンドウでデバッグが可能・・・
という触れ込みなわけですが、ヒープまわりでエラーが出ます。
結局のところカスタムLuaなのが諸悪の根源なのですが、dllのソースもないのでここで手詰まり。

たぶん、LuaBinariesの「Lua 5.0.2 - Release 2」から取ってきたLua50.dllを自作アプリにそのまま使用している場合に限り
上記の方法で使えるのかな・・・と憶測します。


QDE1.0を試してみた

LuaEditと同様にQDEDebugClient.dllがついています。これをリンクして・・・
Lua_StateをQDEDebugClient_Initializeに食わせて、
QDEのexeを起動し、プロジェクトをロードしておいて、
プロジェクトのプロパティのDebuggerのAttachをYesにしてデバッグを開始してから
自作アプリ側でQDEDebugClient_Connectすれば接続はできます。
が、さっぱりbreakなどできないのでやはりダメ。

こちらもソースがないので手詰まり。


RemDebug

しょうがないのでグラフィカルなデバッガは一旦あきらめて、
コマンドラインのデバッガをためしてみることに。

ダウンロードは公式ページのリンクが切れてますが・・・
こちら(LuaForge)から可能です。

ここではまったのが、RemDebugはLuaFileSystemLuaSocketという外部モジュールを
使用するのですが、これらをまっとうにロードするのが一苦労。
以下のような点に気をつける必要があります。

・Lua同梱ライブラリ
loadlibライブラリをopenしていなければダメです。
 これを忘れていると calling nil value とかのエラーメッセージが出ます。

compat(Lua5.1仕様のモジュールロードをLua5.0で実現するライブラリ)
compat-5.1.c をソースに追加しておいて、さらにcompat-5.1.luaをロードする必要があります。

・モジュールのパス
Lua5.0.2 + compat5.1r4の環境そのままであれば、

require "aaaa.bbbb"

と書いたときにでロードされるものは、
カレントディレクトリ/aaaa/bbbb.lua
または
カレントディレクトリ/aaaa/bbbb.so
です。
そのままでは、.dllという名前では読み込めません。

ただし、lua,dllのロードパスは以下のような感じで環境変数として設定可能です。
set LUA_PATH=luamodules/?.lua;?.lua
set LUA_CPATH=luamodules/?.dll;?.dll

一見惑わされやすいのは、? のところですが、
? のところには、上記の例でいうと aaaa/bbbb のような文字列が入りますので注意。


上記のLUA_PATH/LUA_CPATH設定の場合ならばだいたい以下のようなファイル配置が正解です。
(RemDebug+LuaFileSystem+LuaSocket+compat-5.1)

luamodules/socket/core.dll
luamodules/socket/http.lua
luamodules/socket/ftp.lua
luamodules/socket/smtp.lua
luamodules/socket/tp.lua
luamodules/socket/url.lua
luamodules/mime/core.dll
luamodules/lfs.dll -- LuaFileSyetem
luamodules/socket.lua
luamodules/mime.lua
luamodules/ltn12.lua
luamodules/remdebug/engine.lua -- RemDebug
luamodules/controller.lua (これはモジュールじゃないのでどこでもいい)
luamodules/compat-5.1.lua -- compat


以下のような環境変数を設定しておけばLuaの開始時にcompatを自動ロードするようです。
が、別にdofile("luamodules/compat-5.1.lua")等で呼んでも問題ないはずです。
set LUA_INIT=@luamodules/compat-5.1.lua


・ヒープ
 これが一番悩ましいのですが、Luaをスタティックライブラリとして自作アプリにリンクしている場合、
 そのままではLua外部モジュールが正常にロードできません!

 なぜかといいますと・・・Luaライブラリをスタティックリンクしていると、
 自作アプリ部のLua部と、ロードしたモジュールのDLLが持つLua部とが別のインスタンスを持ってしまい、その結果、それぞれのLua部で確保したメモリはそれぞれ別のヒープのものになってしまいます。VC++のライブラリでは、dbgheap.cppなどでヒープのチェックをしており、ここでassertチェックにかかってしまいます。

 そこで解決方法ですが、Lua部分(コア+ライブラリ)はとにかくDLL化してしまえばいいのです。
 通常のDLLプロジェクトの手法に加え、プリプロセッサのマクロ設定を LUA_API=__declspec(dllexport) のようにすればインポートライブラリlibが作られるので、アプリ本体からそれをリンク(または参照設定)してやればOKと思います。

・カスタムLuaの場合
 日本で開発されている方は日本語化などでLuaに何らかのパッチが当たってしまっていると思います。
 LuaがオリジナルそのままであればLuaBinariesのDLL(Lua50.dll)を使えばいいのですが、カスタムではそうもいかないので、自前で作成する必要があります。さらにLuaをリンクするモジュール本体のDLLもソースからコンパイルしなおしです。仕方ないとはいえ、面倒だ・・・。

・LuaSocketのDLL

LuaSocketのソースをVCでビルドするとsocket.dllとmime.dllができますが、それぞれ
以下のようなディレクトリに置いてcoreにリネームする必要があります。(と思います)

socket/core.dll
mime/core.dll

そしてLuaFileSystemのlfs.dllも同様にビルドしなければなりません。


・ようやくRemDebug

controller.luaをスタンドアロンのLua.exeから起動すると接続待ちになるので、
そこで自作アプリを起動すれば接続が完了してブレーク状態になります。

そこから(ようやく!)ブレークポイントを設定したりウォッチ変数を設定したりできます。
runとすれば実行を再開します。
ただ・・・UIが非常に貧弱だし、情報表示コマンドがほとんどないので、
実用上はかなり機能不足の感はあります。
が、いずれにしてもこれで一応のデバッグは可能です。

不満がある場合には、
RemDebugのソースは十分に短い(アプリ側8kb+コントローラ8kb)ので、
好きなようにカスタマイズして使うのが良いかもしれません。


こんなに苦労したくない人は、Luaの持つdebug関数でいじくりまわすほうが近道かもしれません^^;;

ふぅー。
こんなことでこんなに疲れるとわー

スポンサーサイト

テーマ:Windowsプログラミング - ジャンル:コンピュータ

2006.01.12 | Comments(1) | Trackback(0) | Lua

コメント

LuaEclipse

とても参考になる記事ありがとうございます。

LuaのIDEとして、Eclipse + LuaEclipseに期待しています。HPによると、LuaEclipse v1.3.0からRemDebugが内蔵されてデバッグにも使えるそうです。

早速試してみたのですが、、、ブレークポイントを設定してもブレークできず、変数のウォッチもできませんでした。。。(実行だけはできましたが)

LuaEclipseを使用されたことありますか?
もしあれば、使い方など紹介して頂けるとうれしいです。
よろしくお願いします。

2008-12-25 木 02:02:12 | URL | H.M. #ATOhhJhU [ 編集]

コメントの投稿


秘密にする

新しい記事へ <<  | HOME |  >> 古い記事へ

広告:

カテゴリ展開メニュー

  • 未分類(13)
  • Lua(38)
  • プログラミング(11)
  • 食べ物(3)
  • SPAM(2)
  • ゲーム開発(4)
  • GIS/GPS/GoogleMaps(2)
  • スポーツ(1)
  • Skype API(1)
  • AR(1)

はてブ ランキング

ブログ全体: このWikiのはてなブックマーク数

プロフィール

はむ!

Author:はむ!
よく使う言語・環境:
C++,C,Lua,java,VBA,DB
たまにPHPとかjavascript
血液型:O型

メール: lua%ham.nifty.jp
(%を@に変えてください)
ついったー: @hammmm

Lua関連アンテナ

ブロとも申請フォーム

この人とブロともになる

全記事表示リンク

全ての記事を表示する

ブログ内検索


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。