🐌
TinyCCのデバッグ環境をつくる
はじめに
TinyCC に少し興味が出てきたので、
ソースを追いかけてみることにしました。
その前にデバッグ環境を整えてみます。
私はVisual Studio Codeを使用したいので、ここでデバッグが出来る環境を作ります。
作成
といっても、作成はそれほど難しくはありません。
ソースの取得
tccのコードを取得します。
git clone https://repo.or.cz/tinycc.git
取得した段階では、以下のような状態になっていました。
$ git log
commit fbef90a7039b994907db34fde50f6fa5e46ab535 (HEAD -> mob, origin/mob, origin/HEAD)
Author: Michael Matz <matz@suse.de>
Date: Wed Feb 3 04:30:11 2021 +0100
Fix a VLA problem
see testcase, reduced example of a situation reported by
Kyryl Melekhin in https://github.com/kyx0r/neatvi/ .
Problem is that setting up the VLA sp-save in a scope that isn't
entered at runtime leaves traces of it in outer scopes that then
try to restore the stack pointer from uninitialized slots.
とりあえず、この状態のまま使用することとします。
デバッグオプションを付けてビルド
オプションを付けないと、デバッグ情報がつかないので、
デバッグオプション-g
を付けてビルドします。
./configure --help
でヘルプを見ると
情報が書かれていました。
$ ./configure --help
Usage: configure [options]
Options: [defaults in brackets after descriptions]
Standard options:
--help print this message
<省略>
Advanced options (experts only):
<省略>
--debug include debug info with resulting binaries
ヘルプのとおり、--debug
をつけてみます
$ ./configure --debug
Binary directory /usr/local/bin
TinyCC directory /usr/local/lib/tcc
Library directory /usr/local/lib
Include directory /usr/local/include
Manual directory /usr/local/share/man
Info directory /usr/local/share/info
Doc directory /usr/local/share/doc
Source path <省略>
C compiler gcc (9.3)
Target OS Linux
CPU x86_64
Triplet x86_64-linux-gnu
Config debug
Creating config.mak and config.h
config.h is unchanged
つづいて、Make。 -g
オプションが付いています。
$ make
gcc -o tcc.o -c tcc.c -DCONFIG_TRIPLET="\"x86_64-linux-gnu\"" -DTCC_TARGET_X86_64 -DONE_SOURCE=0 -Wall -O2 -Wdeclaration-after-statement -fno-strict-aliasing -Wno-pointer-sign -Wno-sign-compare -Wno-unused-result -Wno-format-truncation -I. -g
<省略>
perl ./texi2pod.pl tcc-doc.texi tcc-doc.pod
pod2man --section=1 --center="Tiny C Compiler" --release="0.9.27" tcc-doc.pod >tcc.1 && rm -f tcc-doc.pod
Visual Studio Codeの設定
.vscode/launch.json
の設定は以下のようにしました。
args
の引数に設定している${workspaceFolder}/examples/ex5.c
はtccのコードの中にあったサンプルのコードです。
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 起動",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/tcc",
"args": ["${workspaceFolder}/examples/ex5.c"],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
// "console": "externalTerminal",
"MIMode": "gdb",
"setupCommands": [
{
"description": "gdb の再フォーマットを有効にする",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
]
}
デバッグ開始
適当な場所にブレークをはり、デバッグを開始してみます。
出来ました。
Discussion