debugライブラリ詳説
debug.traceback、getinfo、getlocal、getupvalueで内部情報を調査します。
「debugライブラリ詳説」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
debug ライブラリの概要
debug ライブラリは、Lua のイントロスペクションツールキットです。任意の関数、コルーチン、スタックフレームの実行時状態を調査し、変更できます。
debug.getinfo の詳細
debug.getinfo(f, what) は what フラグを受け取ります。"n"(名前)、"S"(ソース)、"l"(現在の行)、"u"(アップバリュー)、"f"(関数参照)です。
local function foo()
local info = debug.getinfo(1, "nSlu")
print(info.name) -- foo
print(info.short_src) -- source file
print(info.currentline) -- line number
print(info.nups) -- number of upvalues
end
foo()ローカル変数の調査
debug.getlocal(level, n) は、指定したスタックレベルにある n 番目のローカル変数の名前と値を返します。レベル 1 は現在の関数です。
local function example()
local x, y = 10, 20
local i = 1
while true do
local name, val = debug.getlocal(1, i)
if not name then break end
print(name, val)
i = i + 1
end
end
example() -- x 10 / y 20ローカル変数の変更
debug.setlocal(level, n, value) は、実行時にローカル変数の値を変更します。デバッグやテストに強力な機能です。
アップバリューの調査
debug.getupvalue(fn, n) は、関数の n 番目のアップバリューの名前と値を返します。nil が返されるまで n を増やしながら反復します。
local count = 0
local function inc() count = count + 1 end
print(debug.getupvalue(inc, 1)) -- count 0
debug.setupvalue(inc, 1, 99)
inc()
print(count) -- 100スタックの走査
debug.getinfo が nil を返すまでレベルを増やすことで、呼び出しスタック全体を走査できます。
local function printStackTrace()
local level = 1
while true do
local info = debug.getinfo(level, "Sln")
if not info then break end
print(level, info.short_src, info.currentline, info.name)
level = level + 1
end
enddebug.traceback
debug.traceback(msg, level) は、整形されたスタックトレース文字列を返します。本番環境のエラー処理で最も実用的なデバッグ関数です。
コルーチンの調査
コルーチンを debug.getinfo の第 1 引数に渡すと、そのスタックを調査できます。
local co = coroutine.create(function()
print(debug.getinfo(1, "l").currentline)
end)
coroutine.resume(co)トレース用の debug.sethook
関数名を出力する call フックを設定すると、プログラム内のすべての関数呼び出しをトレースできます。
debug.sethook(function(event)
if event == "call" then
local info = debug.getinfo(2, "Sn")
print("CALL:", info.name or "?")
end
end, "c")移植性のあるアサーション
debug.getinfo(2, "Sl") を使用すると、アサーションエラーにファイルと行の情報を含められます。
local function assert2(cond, msg)
if not cond then
local info = debug.getinfo(2, "Sl")
error(("[%s:%d] %s"):format(info.short_src, info.currentline, msg), 2)
end
end注意
debug ライブラリはカプセル化を破壊したり、プログラムを大幅に遅くしたりする可能性があります(特に debug.sethook)。また、すべての環境で利用できるわけではありません。開発とテストでのみ使用してください。
debug ライブラリの確認
debug.getupvalue(fn, 1) は何を返しますか?
まとめ:debug ライブラリの詳細
debug ライブラリは、スタックの調査(getinfo)、ローカル変数の調査と変更(getlocal/setlocal)、アップバリューへのアクセス(getupvalue/setupvalue)、フックベースのトレース(sethook)を提供します。開発時にのみ、責任を持って使用してください。
よくある質問
「debugライブラリ詳説」レッスンは無料ですか?
はい。「debugライブラリ詳説」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「debugライブラリ詳説」で何を学びますか?
debug.traceback、getinfo、getlocal、getupvalueで内部情報を調査します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「debugライブラリ詳説」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。