この初版はLua 5.0向けに書かれました。後続バージョンでも大部分は関連性がありますが、いくつかの違いがあります。
第4版はLua 5.3を対象としており、Amazonおよびその他の書店で購入できます。
本書を購入することで、Luaプロジェクトの支援にもなります。
![]() |
プログラミングインLua | ![]() |
第III部 標準ライブラリ 第23章 デバッグライブラリ |
デバッグライブラリにおける主要な自己検査関数は、debug.getinfo
関数です。その最初の引数は、関数またはスタックレベルです。ある関数foo
に対してdebug.getinfo(foo)
を呼び出すと、その関数に関するデータを含むテーブルを取得します。そのテーブルには、以下のフィールドが含まれる場合があります。
source
--- 関数が定義された場所。関数が文字列(loadstring
を通して)で定義された場合、source
はその文字列です。関数がファイルで定義された場合、source
は`@
´を接頭辞としたファイル名です。short_src
--- source
の短いバージョン(最大60文字)、エラーメッセージに役立ちます。linedefined
--- 関数が定義されたソースの行。what
--- この関数の種類。foo
が通常のLua関数であれば"Lua"
、C関数であれば"C"
、Luaチャンクのメイン部分であれば"main"
です。name
--- 関数の妥当な名前。namewhat
--- 前のフィールドの意味。このフィールドは"global"
、"local"
、"method"
、"field"
、または""
(空文字列)です。空文字列は、Luaが関数の名前を見つけられなかったことを意味します。nups
--- その関数のアップ値の数。func
--- 関数自体。後述。foo
がC関数の場合、Luaはその関数に関するデータはあまり持ちません。このような関数では、what
、name
、namewhat
フィールドのみが関連します。
ある数値nに対してdebug.getinfo(n)
を呼び出すと、そのスタックレベルでアクティブな関数に関するデータを取得します。例えば、nが1の場合、呼び出しを行っている関数に関するデータを取得します。(nが0の場合、getinfo
自体(C関数)に関するデータを取得します。)nがスタック内のアクティブな関数の数よりも大きい場合、debug.getinfo
はnilを返します。アクティブな関数を照会する場合、数値でdebug.getinfo
を呼び出すと、結果のテーブルには、関数がその時点で存在する行を示すcurrentline
という追加フィールドが含まれます。さらに、func
にはそのレベルでアクティブな関数が含まれます。
name
フィールドは扱いが難しいです。Luaでは関数が第一級の値であるため、関数は名前を持たない場合や、複数の名前を持つ場合があります。Luaは、その値を持つグローバル変数を探すこと、または関数を呼び出したコードを調べて呼び出し方法を確認することによって、関数の名前を見つけようとします。この2番目のオプションは、数値を使用してgetinfo
を呼び出す場合、つまり特定の呼び出しに関する情報を取得する場合にのみ機能します。
getinfo
関数は効率的ではありません。Luaは、プログラムの実行を妨げない形式でデバッグ情報を保持しています。効率的な取得はここでは二次的な目標です。パフォーマンスを向上させるために、getinfo
には、取得する情報を選択するオプションの第2引数があります。この引数を使用すると、ユーザーが必要としていないデータの収集に時間を無駄にすることはありません。この引数の形式は文字列であり、各文字は次の表に従ってデータのグループを選択します。
`n ´ | name フィールドとnamewhat フィールドを選択します。 |
`f ´ | func フィールドを選択します。 |
`S ´ | source 、short_src 、what 、linedefined フィールドを選択します。 |
`l ´ | currentline フィールドを選択します。 |
`u ´ | nup フィールドを選択します。 |
次の関数は、debug.getinfo
の使用方法を示しています。アクティブなスタックのプリミティブなトレースバックを出力します。
function traceback () local level = 1 while true do local info = debug.getinfo(level, "Sl") if not info then break end if info.what == "C" then -- is a C function? print(level, "C function") else -- a Lua function print(string.format("[%s]:%d", info.short_src, info.currentline)) end level = level + 1 end end
getinfo
からより多くのデータを含めるなど、この関数を改善するのは難しくありません。実際、デバッグライブラリには、そのような改良版であるdebug.traceback
が用意されています。当社のバージョンとは異なり、debug.traceback
は結果を出力しません。代わりに、文字列を返します。Copyright © 2003–2004 Roberto Ierusalimschy. All rights reserved. | ![]() |