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를 디버깅 하가위해서는 빌드 옵션을 추가로 넣어줘야함
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)를 하면 디버깅 모드로 진입함
레퍼런스