3

AndroidアプリをFreePascalでコンパイルされたJARにリンクしようとしています。次のビルドエラーが発生します:

[2012-09-14 16:08:38 - MyApp] Dx 
EXCEPTION FROM SIMULATION:
[2012-09-14 16:08:38 - MyApp] Dx local 0009: invalid

[2012-09-14 16:08:38 - Yarxi] Dx ...at bytecode offset 00015f2c
locals[0000]: Lcom/mypackage/$Core$$_fpc_nestedvars$70;
locals[0001]: I
locals[0002]: I
locals[0003]: I
locals[0004]: I
locals[0005]: I
locals[0006]: I
locals[0007]: I
locals[0008]: I
locals[0009]: <invalid>
locals[000a]: <invalid>
(..more locals... much more)
locals[06db]: <invalid>
stack[0003]: I
stack[0002]: I
stack[0001]: [I
stack[top0]: int{0x00000000 / 0}
...while working on block 5f23
...while working on method $MyMethod$944$FPR1:(Lcom/mypackage/$Core$$_fpc_nestedvars$70;)V
...while processing $MyMethod$944$FPR1 (Lcom/mypackage/$Core$$_fpc_nestedvars$70;)V
...while processing com/mypackage/Core.class

[2012-09-14 16:08:40 - MyApp] Dx 1 error; aborting
[2012-09-14 16:08:40 - MyApp] Conversion to Dalvik format failed with error 1

エラーは、ある時点で、コードが初期化されていないローカル0009を読み取ろうとしたことのようです。

現在、Pascalはローカル変数の初期化を強制しません。おそらく、初期化はそもそも省略されていました。FreePascalが生成したJVMアセンブリファイルを保持しました。それらはJasminでクラスファイルにアセンブルされます。ファイルは巨大です-私はそれをここに貼り付けていません。

誰かがエラーのポイントをソースまでさかのぼるのを手伝ってくれませんか?エラーはバイトコードオフセット00015f2cにあります。それをアセンブリファイルの行番号に戻す方法はありますか?

4

1 に答える 1

2

解決しました。00015f2c (10 進数で 89900) は、実際にはメソッド内のバイトコード オフセットです。私は次のことをしました。

まず、Jasmin を直接呼び出し、生成された .j ファイルと -g オプション (行番号を生成) を渡します。

java -jar %JASM% -g Core.j

Free Pascal 自体は -g を発行しません。これにより、FPC で生成された .j ファイルに関連する行番号を持つ別の Core.class ファイルが得られました。次にjavap、クラスを逆アセンブルして別の .j ファイルに戻しました。

"%JDKROOT%\javap" -l -c Core.class >Core_WithLines.j

しかし、この新しい .j ファイルには、個々のコマンドの行番号とオフセットが含まれていました。次に、問題のあるメソッドでオフセット 89900 を検索しました (注: によって生成されたオフセットは、javap65536 で折り返されます)。次に、そのメソッドの本体の下にある LineNumberTable (オフセットと行番号の両方の折り返し) を調べたところ、このオフセットに対応するソース Core.j ファイルの行番号が見つかりました。Core.j を見返してみると、Pascal ソースの行番号を含むコメントがありました。

確かに、初期化されていない変数を渡す関数呼び出しがありましたが、varパラメーターとして渡されました。

この問題は、Pascal/JVM 境界の問題のようなものです。変数は初期化されていませんでしたが、ref によって関数に渡され、後者から返されました。コンパイラはどうにかしてそれを抽象化する必要がありましたが、私見ですが、FPCはそうしませんでした。

于 2012-09-14T21:18:09.477 に答える