레이블이 gdb인 게시물을 표시합니다. 모든 게시물 표시
레이블이 gdb인 게시물을 표시합니다. 모든 게시물 표시

k8s ingress-nginx-controller 설정(nginx.conf) 파악

# ingress-nginx(controller) 에서 ysoftman.lemon.com / 에 대한 처리가
# 어떻게 되는지 보기 위해 --v=3 옵션을 주고 ingress-nginx-controller 를
# 다시 시작(deployment 리소스가 없으면 daemonset 리소스를 수정)
# 다음과 같이 실제 nginx 설정이 어떻게 되어 있는지 볼 수 있지만 diff 만 보인다.ㅠㅠ
kubectl logs -f $(kubectl get pod -n ingress-nginx  | rg -v NAME | awk '{print$1}' | head -1) -n ingress-nginx | rg "server_name ysoftman.lemon.com" -C 50

# 실제 running 중인 ingress-nginx-controller 의 nginx.conf 을 덤프해보자.
# nginx 동작하는 노드 접속
ssh ysoftman@인그레스서버

# nginx-controller 도커 컨테이너에 접속
sudo docker exec -it --user=0 --privileged $(sudo docker ps | grep ingress-nginx-controller | awk '{print $1}') bash

# nginx 가 --with-debug 옵션으로 동작 중인지 확인
nginx -V 2>&1 | grep -- '--with-debug'

# nginx master PID 파악해서 gdb 로 열기
gdb -p $(ps -ef | grep "nginx: master" | grep -v grep | awk '{print $2}')

# (gdb) 에 아래 명령 복붙
set $cd = ngx_cycle->config_dump
set $nelts = $cd.nelts
set $elts = (ngx_conf_dump_t*)($cd.elts)
while ($nelts-- > 0)
set $name = $elts[$nelts]->name.data
printf "Dumping %s to nginx_conf.txt\n", $name
append memory nginx_conf.txt \
        $elts[$nelts]->buffer.start $elts[$nelts]->buffer.end
end

# (gdb) 종료
quit

# 덤프된 nginx_conf.txt 확인
cat nginx_conf.txt

# 호스트로 빠져 나온다.
exit

# 컨테이너 -> 호스트(노드)로 nginx_conf.txt 복사
sudo docker cp $(sudo docker ps | grep ingress-nginx-controller | awk '{print $1}'):/etc/nginx/nginx_conf.txt .

# 로컬로 빠져 나온다.
exit

# 노드 -> 로컬로 nginx_conf.txt 복사
rsync ysoftman@인그레스서버:/home/ysoftman/nginx_conf.txt .

# nginx_conf.txt 파일이 너무 크니
# ## start server ysoftman.lemon.com  ~  ## end server ysoftman.lemon.com 만 남기고 지운다.

# 문제가 있는 location 의 라인번호를 보고 다시 nginx_conf.txt 에서 찾아 보자
rg -n "location " nginx_conf.txt


#####


# 좀더 편하게 kubectl ingress-nginx 플러그인을 사용해 파악할 수도 있다.
# nginx-controller 가 daemonset 으로 동작하는 경우 pod 를 찾을 수 없다고 나온다.
# deployment 로 동작하는 경우만 작동하는것으로 보인다.
# 설치
brew install krew
kubectl krew install ingress-nginx
export PATH="${PATH}:${HOME}/.krew/bin"

# 백엔드 정보
kubectl ingress-nginx backends -n nginx-ingress

# 특정 호스트 관련 설정 정보
kubectl ingress-nginx conf -n ingress-nginx --host testaddr.local


gdbserver 로 원격 디버깅

# local 은 mac 이고 remote 는 centos docker g++ 환경
# centos 7 gdbserver 설치
sudo yum install gdb-gdbserver

# mac 에 gdb 설치
brew install gdb

# 도커 컨테이너에서 gdbserver 실행시 같은 에러가 발생하면
Cannot trace created process PTRACE_O_TRACEFORK test: Operation not permitted

# docker run 시 다음 옵션을 추가해서 실행해야 한다.
--cap-add=SYS_PTRACE --security-opt seccomp=unconfined 옵션을 추가한다.

# 로컬 port 바인딩도 필요하다.
-p 9999:9999

# remote 에서
# remote 테스트 ysoftman.cpp 파일 작성
cat > ysoftman.cpp << zzz
#include <iostream>
#include <string>
using namespace std;
int main() {
    int a = 1;
    cout << a << endl;
    string s = "ysoftman";
    cout << s << endl;
    return  0;
}
zzz

# 빌드, -g 옵션으로 디버깅 정보를 포함시킨다.
g++ -g ysoftman.cpp

# gdbserver 실행시
gdbserver 127.0.0.1:9999 ./a.out

# gdbserver 강제 종료시
# (gdb 에서 quit 하면 gdbserver 도 종료된다.)
kill -9 $(ps -ef | grep -i "gdbserver 127.0.0.1" | grep -v "grep" | awk '{print $2}')

# local 에서도 ysoftman.cpp 가 있어야 소스를 볼 수 있다.
gdb
(gdb) target remote 127.0.0.1:9999
(gdb) list  #소스보기
(gdb) b 9 #9줄 브레이크 포인트
(gdb) continue # remote 는 run 대신 continue로 실행한다.
(gdb) info locals # 지역변수 보기
(gdb) p a  #변수 a 값 출력
(gdb) quit  #하면 gdb 도 종료된다.

Eclipse 윈도우에서 C++ 환경 만들기

1. 윈도우에서 사용할 수 있는 C++ 컴파일러 구성
MinGW(Minimalist GNU for Windows)로 GNU 일부 툴들을 윈도우 환경에서 사용할 수 있다.
http://www.mingw.org/ 에서 다운받는다.
MinGW Installer Manger 에서 Basic Setup 부분의 항목들을 체크 -> Installation -> Apply 로 설치한다.
설치가 끝나면 bin 경로(C:\MinGW\bin) 를 시스템 환경변수에 추가한다.


2. 이클립스에서 C++ 개발 툴 플러그인 구성(또는 이클립스 CDT 사용)
이클립스 Install New Software -> Work with -> --All Available Sites-- -> Programming Language -> C/C++ 체크하여 설치
이클립스 C/C++ Prerspective 에서
File 메뉴 -> New -> C++ Project -> Project Type -> Executable 중 하나 선택 -> Tool Chains -> MinGW GCC 선택한다.

.c / .cpp 파일 빌드 (ctrl+b) 후 실행(F11) 해보자~

[참고]
맥이나 리눅스에서 debug  실행시 다음과 같은 에러가 발생한다면
"Error with launching command: gdb --version"
gdb 가 없다면 설치하고 위치를 다음 프로젝트 설정에 명시하도록 한다.
Preferences -> C/C++ -> Debug -> GDB -> GDB debugger -> /usr/local/bin/gdb
디버그 설정
Debug Configurations -> C/C++ Application ->  xxx -> Debugger -> GDB debugger -> /usr/local/bin/gdb

Linux segmentation fault (core dumped) 시 gdb 로 디버깅하기

# 프로그램 런타임시 세그멘테이션 오류가 날경우 core.xxxx 파일로 덤프되어 디버깅할 수 있다.
segmentation fault (core dumped)

# 만약 core.xxx 파일이 보이지 않을때 다음과 같이 ulimite 로 core block 사이즈를 지정한다.
ulimit -c 10000

# 프로그램을 다시 실행하면 segmentation fault (core dumped) 메시지와 함께 core 파일이 생성된다.
# 다음과 같이 gdb 에 생성된 코어파일과 프로그램을 인자로 주어 실행한다.
gdb -c=core.1234 ./testprogram


### 자주 사용된는 명령들 ###
# bt(backtrace) 또는 where 로 segmentation fault 가 발생 부분 이전까지의 순서(콜스택)을 파악
(gdb) bt

# 콜 스택에서 이전 수행 위치로
(gdb) up

# 콜 스택에서 다음 수행 위치로
(gdb) down

# 콜 스택에서 프레임으로 이동
(gdb) frame 프레임번호
# 또는
(gdb) f 프레임번호

# 현재 프레임에서 소스 보기
(gdb) list
# 또는
(gdb) l

# 소스코드 9번째 줄 브레이크포인트
(gdb) b 9

# 소스코드 브레이크포인트까지 실행
(gdb) r

# 현재 프레임에서 변수 내용 출력
# optimized out 으로 나오면 빌드시 최적화 옵션으로 값이 저장되지 않은 경우다.
# 빌드시 최적화하지 않음(-O0) 옵션을 주면 볼 수 있다.
(gdb) print 변수명
# 또는
(gdb) p 변수명

# 현재 프레임에서 지역 변수 출력
(gdb) info locals

# 모든 전역 변수 확인
(gdb) info variables

# 종료
(gdb) quit

# 도움말
(gdb) help all

# 특정 명령어 도움말
(gdb) help 명령어