TinyCCのデバッグ環境をつくる

3 min読了の目安(約3400字TECH技術記事

はじめに

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
                }
            ]
        },
    ]
}

デバッグ開始

適当な場所にブレークをはり、デバッグを開始してみます。

出来ました。