Clause
← Уся документація

Англійський оригінал змінився після перекладу, тож частина тексту може бути застарілою. Читати англійською

Перекладено з англійського оригіналу · 1e3a39c8-dirty · 2026-10-26

Налагодження виконуваних файлів

-g генерує таблиці рядків вихідного коду Erlang. Вони працюють на кожному рівні оптимізації та з --emit, позиційним компонуванням -o і цілями проєкту.

Таблиці рядків

Компонування

-g передає -g драйверу Clang. Цілі MSVC також записують PDB, на який виконуваний файл посилається лише за іменем файлу (/PDBALTPATH:%_PDB%); його публікують поруч із виконуваним файлом як <name>.pdb, після виконуваного файлу, в тій самій відкладеній публікації. Виконувані файли ELF зберігають DWARF усередині. Виконуваним файлам Mach-O потрібен був би dsymutil над підготовленими об'єктними файлами до видалення проміжної області; він не запускається, тож виконувані файли macOS втрачають таблиці рядків під час компонування.

Стек викликів Erlang

Згенерований код переходить між функціями хвостовими передачами через стек процесу (модель виконання), тому нативний backtrace показує поточну функцію Erlang, а потім планувальник (ProcessStack::run, Executor::work). Фрейми Erlang зупиненого процесу друкує допоміжна функція runtime clause::runtime::debug_erlang_stack(), починаючи з найглибшого, у вигляді module:function/arity; вона читає процес, що виконується в потоці, і скомпільовані імена фреймів, ніколи не звертаючись до таблиць атомів runtime:

(lldb) breakpoint set --file debug.erl --line 8
(lldb) run
* thread #1, stop reason = breakpoint 1.1
    frame #0: debug.exe`leaf at debug.erl:8
(lldb) expr -- clause::runtime::debug_erlang_stack()
  debug:leaf/1
  debug:middle/1
  debug:main/1

У GDB виклик записується як call clause::runtime::debug_erlang_stack() після set language c++ (фрейми коду Erlang не мають мови, в якій GDB розбирає імена C++). Він називає фрейми twice () at /path/debug.hrl:5. Виконувані файли -Os можуть відкинути цю допоміжну функцію разом з іншим кодом, на який немає посилань.

Тести