envoy 빌드 및 디버깅 해보기!

gyubong park·2021년 6월 16일
0
post-thumbnail

envoy를 빌드해보고 생성된 바이너리를 통해 디버깅을 해보겠음

Envoy 빌드

IDE: Visual Studio Code
OS: ubuntu20

envoy git
https://github.com/envoyproxy/envoy

envoy는 bazel을 통해 빌드스크립을 실행
bazel 다운로드

sudo wget -O /usr/local/bin/bazel https://github.com/bazelbuild/bazelisk/releases/latest/download/bazelisk-linux-amd64
sudo chmod +x /usr/local/bin/bazel

기본적인 빌드 스크립트는

bazel build -c fastbuild //source/exe:envoy-static --copt="-Wno-error"
  • fastbuild: -O0, aimed at developer speed (default).
  • opt: -O2 -DNDEBUG -ggdb3 -gsplit-dwarf, for production builds and performance benchmarking.
  • dbg: -O0 -ggdb3 -gsplit-dwarf, no optimization and debug symbols.

빌드 환경에서 아무 문제없이 빌드가 된다면 다행이만 내 경우에는 gcc 컴파일 에러가 발생하였다.
검색을 해보니 envoy 빌드는 clang 컴파일러가 적합하다고 하니 clang을 빌드해보았다.
envoy_home/bazel 폴더 내부에 setup_clang 스크립트가 존재하다.
첫번째로, CLang+LLVM 바이너리를 다운 받고, 다운받은 위치에서 압축을 풀고 setup_clang.sh 스크립트 실행하면 $envoy_home에 clang.bazelrc 파일이 생겨난다.

# setup_clang.sh
bazel/setup_clang.sh <PATH_TO_EXTRACTED_CLANG_LLVM>

그리고 opt 옵션을 주고 빌드를 해보았다.

# opt 옵션 빌드
bazel build -c opt //source/exe:envoy-static --config=clang

아무런 에러없이 빌드에 성공하였다.

Envoy 디버깅 해보기

envoy를 디버깅 하가위해서는 빌드 옵션을 추가로 넣어줘야함

bazel build -c dbg //source/exe:envoy-static --copt="-Wno-error"

bazel build 옵션에 dbg를 넣어주면 됨

그 외에도 여러가지 옵션을 추가할 수 있다.

bazel build -c dbg --copt=-fno-limit-debug-info --config=clang //source/exe:envoy-static --copt="-Wno-unused"

bazel build -c dbg --verbose_explanations --verbose_failures //source/exe:envoy-static --sandbox_debug --copt="-Wno-unused"

빌드가 끝나면 gdb를 통해 디버깅 해보자
필자는 vscode를 쓰고 있으므로 vscode에서 실행

빌드된 바이너리는 "${workspaceFolder}/bazel-bin/source/exe/envoy-static" 생성됨
따라서 launch.json을 아래와 같이 넣어줌

{
    // 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) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/bazel-bin/source/exe/envoy-static",
            "args": ["-c", "/home/bong/envoy/envoy-1.17.3/envoy/examples/front-proxy/front-envoy.yaml"],
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "lldb"
        },
    ]
}

그 다음 브레이크포인터를 찍고 debug start(F5)를 하면 디버깅 모드로 진입함

레퍼런스

profile
초보 개발자

0개의 댓글