kumasysjp

VS Code gdb [Win & Linux 対応プログラム開発環境の構築6]

prev: [VS Code SSH] Win & Linux 対応プログラム開発環境の構築5

 

VS Code から Remote で gdb が出来るけれども,  ブレークポイント(breakpoint) が機能しないということがある。

その原因は root 権限でもない(root権限はいらない)し、launch.json に特別な何かが必要なわけでもない。

たんじゅんにビルドの時点で  デバッグオプション付けていないからである。

いや  – gつけてると思っていてもそれがリンカの時点なのか、コンパイルの時点なのか見る。いったんオブジェクトを生成している場合はその時点でつける、

すなわち、


gcc -g -O0 -c -o KumaNetCom/KumaNetCom.o KumaNetCom/KumaNetCom.cpp
gcc -g -O0 -c -o KumaNetCom/LinuxUniq.o KumaNetCom/LinuxUniq.cpp
gcc -pthread ./KumaNetCom/KumaNetCom.o ./KumaNetCom/LinuxUniq.o -L/usr/local/lib -o ./KumaNetCom/KumaNet

-g や 最適化O  は コンパイルの時点につける。スレッド機能を利用する場合に必要な -pthread はリンカの時点でつける。

 

VSCode における ビルドタスクの設定は、


    
{
    "version": "2.0.0",
    "tasks": [
      {
        "label": "ExecuteMake",
        "type": "shell",
        "command": "./dbgmake.sh",
        "args": [],
        "options": {
          "cwd": "/home/yuki/_s/KumaNetCom"
        },
        "group": {
          "kind": "build",
          "isDefault": true
        },
        "problemMatcher": []
      }
    ]
}

デバッグタスクの設定は、

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Remote GDB Ubuntu",
            "type": "cppdbg",
            "request": "launch",
            "program": "/home/yuki/_s/KumaNetCom/KumaNetCom/KumaNet",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "/usr/bin/gdb",
            "setupCommands": [
                {
                    "description": "gdb の再フォーマットを有効にする",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "ExecuteMake",
        }
    ]
}

と成る。

 

ちなみに、makeファイルも書いたが、再帰的にかいた場合スマートになる反面、オプションを付けにくい構文になる。


CC            = gcc  -pthread 
DEST          = /usr/local/bin
LDFLAGS       = -L/usr/local/lib
#LIBS          = -lhoge -lm            #include libhoge.a 
CDIRS           = ./KumaNetCom/
BDIRS           = ./KumaNetCom/
OBJS          = $(CDIRS)KumaNetCom.o $(CDIRS)LinuxUniq.o
PROGRAM       = $(BDIRS)KumaNet

all:            $(PROGRAM)

$(PROGRAM):     $(OBJS)
	$(CC) $(OBJS) $(LDFLAGS)  $(LIBS) -o $(PROGRAM)

clean:;         rm -f $(CDIRS)*.o  $(PROGRAM)


この構文では、 Cソースに変更があった場合のみ、当該ソースに関してコンパイルを実行するという処理が、スマートに表示されている。ただし個別にオプションをつけたりするときは、不便である。

 

以上である。