2012-03-15 6 views
0

私はCortex-M4でGCCを使って組み込みプロジェクトにLuaを統合しようとしています。私はLuaスクリプトをロードして実行することができ、CからLua関数を呼び出し、LuaからC関数を呼び出すことができます。 luaL_dostring()のパラメータとして渡されたスクリプトがLua構文エラーを含んでいる場合、Cプログラムがクラッシュします(HardFault_Handlerトラップが上昇します)。ここ与えられたスクリプトに構文エラーがあると、luaL_dostring()がクラッシュする

原因のLuaでの構文エラーにクラッシュし、関連するCコード:

 //create Lua VM... 
     luaVm = lua_newstate(luaAlloc, NULL); 

     //load libraries... 
     luaopen_base(luaVm); 
     luaopen_math(luaVm); 
     luaopen_table(luaVm); 
     luaopen_string(luaVm); 

     //launch script... 
     luaL_dostring(luaVm, "function onTick()\n" 
          " locaal x = 7\n" //syntax error 
          "end\n" 
          "\n"); 

正しいLuaの構文と同じことをやったときに、それが動作します:

luaL_dostring(luaVm, "function onTick()\n" 
         " local x = 7\n" 
         "end\n" 
         "\n"); 

デバッグおよびステッピングluaL_dostring()を使って、私はLuaの行を解析する行に従うことができます。そして、構文エラーで行に到達すると、Cプログラムがクラッシュします。

誰でも手伝いできますか?ありがとう。


は、次のようにLuaのソースコードで無効setjmp/longjmpを持っている:

//#define LUAI_THROW(L,c) longjmp((c)->b, 1) //TODO oli4 orig 
//#define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } //TODO oli4 orig 

#define LUAI_THROW(L,c) while(1) //TODO oli4 special 
#define LUAI_TRY(L,c,a) { a } //TODO oli4 special 

...のでそこはもう使わ一切のsetjmp/longjmpのはありませんが、私はまだ

:-(クラッシュを持っています

は別の原因が必要ですか?

+0

あなたのプラットフォームは 'longjmp'をサポートしていますか?このプログラムは実行時にクラッシュしますか? 'error" boom "'? – lhf

+0

プラットフォームはSTマイクロエレクトロニクスのSTM32F4です。 longjmpをサポートしているようです(これらの関数を使用するとコンパイルされます)。実際にはエラー "foo"を実行するとLuaがクラッシュします。だから、longjmpが正しく動作しないようですね??? – oli4

+0

「longjmp」が最初に見ているようです。 – lhf

答えて

1

問題が見つかりました:それは、Lua構文エラーで呼び出されたsprintf関数です。実際、私のプラットフォームのsprintfは浮動小数点表現をサポートしていないようですn。だから、luaconf.hを次のように変更し、プレゼンテーションを整数形式に制限しました。

//#define LUA_NUMBER_FMT  "%.14g" 
#define LUA_NUMBER_FMT  "%d" 
+0

あなた自身の答えを受け入れるべきです。 – lhf

0

は別の原因を持っている必要があります?

はい:ここではLuaを使用できません。

ルアのエラー処理システムは、setjmp/longjumpのフレームワーク上に構築されています。 LUAI_THROWLUAI_TRYを実行すると、は実行されません。これはlua_errorを意味し、すべての内部エラー処理が機能しなくなります。構文エラーは、Luaの内部エラー処理の一部です。

CコンパイラがC標準ライブラリを適切にサポートしていない場合、Luaは単にその環境で機能しなくなります。あなたはLuaJITを試してみるかもしれませんが、それはもっと良いとは思えません。

+0

私は同意します。 Luaエラー処理を無効にするのは目標ではありませんでした。エラーの原因を特定するために一時的に無効にしていました。 – oli4

関連する問題