0Pricing
Lua Academy · レッスン

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
end

debug.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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. debugライブラリ詳説
  2. MobDebugによるリモートデバッグ
  3. LuaProfilerによるプロファイリング
  4. コードカバレッジとテスト計測
← Lua Academyに戻る