[DEBUG NOTE] 디버깅 노트 2023.02.08 - 2023.03.21



■■■■■■■■■■

<문제>
OSError : [Errno 113] No route to host

<ChatGPT>
how to solve this error? oserror errno 113
오류 번호 113, "No route to host"는 네트워크 요청이 실패할 때
리눅스와 윈도우를 포함한 다양한 운영 체제에서 발생할 수 있는 오류입니다.
이 오류는 다음과 같은 다양한 이유로 인해 발생할 수 있습니다:
1.호스트에 연결할 수 없음: 연결하려는 호스트가 중단되었거나
컴퓨터와 호스트 사이의 네트워크에 문제가 있습니다.
2.방화벽 제한: 방화벽은 특정 포트 또는 IP 주소에 대한 액세스를 차단할 수 있습니다.
방화벽이 연결하려는 호스트에 대한 액세스를 차단하는 경우
"호스트에 대한 경로 없음" 오류가 표시됩니다.
3.잘못된 네트워크 구성: 컴퓨터의 네트워크 구성이 올바르지 않으면
연결하려는 호스트에 연결하지 못할 수 있습니다.
이 문제를 해결하려면 다음 단계를 수행하십시오:
1. 호스트 확인: 호스트에 ping을 실행하여 호스트가 실행 중인지 확인합니다.
그렇지 않으면 호스트 자체에 문제가 있을 수 있습니다.
2. 방화벽 설정 확인: 방화벽이 호스트에 대한 액세스를 차단하고 있지 않은지 확인합니다.
방화벽을 일시적으로 사용하지 않도록 설정하여 문제가 해결되는지 확인할 수 있습니다.
3. 네트워크 구성 확인: 컴퓨터의 IP 주소, 서브넷 마스크, 기본 게이트웨이
및 DNS 설정이 올바른지 확인합니다.
4. 다른 네트워크 사용: 다른 네트워크에서 호스트에 연결할 수 있는 경우 네트워크 구성에
문제가 있을 수 있습니다. 다른 네트워크에서 연결하여 문제가 해결되었는지 확인하십시오.
5. 라우터 구성 확인: 라우터를 사용하는 경우 라우터의 구성을 확인하여
라우터가 호스트에 대한 액세스를 차단하지 않는지 확인합니다.
위의 단계에서 문제가 해결되지 않으면 네트워크 관리자 또는
호스트 관리자에게 문의하여 추가 지원을 요청해야 할 수 있습니다.

<해결>
운영PC의 IP 주소를 잘못 입력했다.

■■■■■■■■■■

<문제>
바이너리 파일 만들 때 에러 발생
raspberry pi -bash: pyinstaller: command not found

<해결>
pip install --upgrade pip
sudo pip3 install pyinstaller
pyinstaller --onefile 0000.py
실행하고 나면 dist 폴더에 생성된 파일 있음

■■■■■■■■■■

<문제>
작업한 코드에서 변수명을 갑작스레 바꾸게 되었다.
이미 다 짠 코드인데 말이지.
하나만 바꾸는게 아니라서 여러개 바꾸면 정신이 없을거다.

<해결>
VScode 에서는 변수명 일괄변경 기능을 제공한다. (다른에디터도 있겠지?)
수정할 변수 블록잡고 ctrl shift L을 누르면 된다.

■■■■■■■■■■

<문제>
dronekit.APIexception heartbeat
dronekit.mavlink: exception in mavlink input loop

<ChatGPT>
"dronekit.mavlink: mavlink 입력 루프에서 예외" 오류는
DroneKit-Python 라이브러리를 사용하여 드론과 통신할 때 발생할 수 있습니다.
이 오류는 일반적으로 드론과의 연결 또는 드론에서 수신되는 데이터에 문제가
있음을 나타냅니다.
다음은 문제를 해결하기 위해 시도할 수 있는 몇 가지 방법입니다:
1. 연결을 확인합니다: 드론에 대한 연결이 안정적인지, 연결 코드에 올바른 포트
및 보드 속도 설정이 사용되는지 확인합니다.
2. 원격 측정 확인: 연결이 안정적인 경우 드론에서 수신 중인 원격 측정 데이터를 확인합니다.
드론 키트-파이썬 라이브러리가 예상하지 못하거나 처리할 수 없는 데이터를
드론이 보내고 있을 가능성이 있습니다.
3. 라이브러리 업데이트: 최신 버전의 DronKit-Python 라이브러리를 사용하고 있는지
확인합니다. "pip install --upgrade dronekit" 명령을 실행하여 pip 패키지 관리자를
사용하여 라이브러리를 업데이트할 수 있습니다.
4. 디버깅: 오류의 근본 원인을 파악하려면 디버그 메시지를 인쇄하거나 디버거를
사용하는 등의 디버깅 기술을 사용합니다.
이러한 솔루션 중 어느 것도 작동하지 않는 경우, 드론 키트-파이썬 커뮤니티
또는 드론 제조업체에 문의하여 추가 지원을 받을 수도 있습니다.

DroneKit에 "Heartbeat timeout" 메시지가 포함된 API 예외는
일반적으로 자동 조종 장치와 GCS(지상 제어 스테이션) 간의 통신이 끊길 때 발생합니다.
이 문제는 두 장치 간의 통신 링크에 간섭이나 중단이 있을 때 발생할 수 있습니다.
"Heartbeat"은 자동 조종 장치가 여전히 작동하고 연결되어 있음을 나타내기 위해
정기적으로 GCS로 전송되는 신호입니다. GCS가 특정 시간 내에 이 신호를
수신하지 않으면 자동 조종 장치가 더 이상 연결되지 않은 것으로 가정하고
"Heartbeat timeout" 메시지와 함께 API 예외를 발생시킵니다.
이 문제를 해결하려면 다음 단계를 수행하십시오:
1. auto pilot과 GCS의 연결 상태를 확인하고, 두 장치가 모두 올바르게 연결되고
구성되었는지 확인합니다.
2. 두 장치 사이의 통신 링크에 간섭이나 장애물이 있는지 확인합니다.
가능한 경우 장치를 시야가 확실한 위치로 이동합니다.
3. GCS와 오토파일럿을 다시 시작하고 다시 시도합니다.
4. 문제가 지속되면 자동 파일럿과 GCS 모두에서 펌웨어를 업데이트합니다.
5. 위의 단계 중 아무 것도 작동하지 않는 경우 제조업체에 문의하거나
DronKit 커뮤니티에 추가 지원을 요청해야 할 수 있습니다.

■■■■■■■■■■

<문제>
listener 파일에 video 송출 문제가 생김.
/dev/video invalid argument 에러가 뜬다.

<가정>
송출자체에 문제가 없다면
rtmp로 들어가면 비디오 볼 수 있어.

<결과>
rtmp에도 안 뜸

Posted by ssanatos
,

[DEBUG NOTE] 디버깅 노트 2022.12.26 - 2022.01.13

■■■■■■■■■■

<문제>
sudo rpi-update 에서 사용자에게 진행여부를 입력받는다.
이를 자동화 해야한다.
그래서 -y를 추가했는데도 안된다.

<검색>
https://github.com/Hexxeh/rpi-update/issues/241

sudo SKIP_WARNING=1 rpi-update 이렇게 입력하란다.

<실험>
위의 명령어로 입력하니 된다.

■■■■■■■■■■

<문제>
라즈베리파이에 우리 제품을 깔았는데, service 가 돌지 않는다.
에러 메시지의 내용은 특정 파라미터를 못 읽어왔다는 것이다.

<가정>
FTP에서 라즈베리파이 OS로 설치파일을 넘길 때 잘못 넘겼다?
디렉토리를 잘못 지정해서 넘겼거나,
특정 디렉토리를 빼야하는데 같이 넣었거나.

<실험>
의심가는 특정 폴더를 넣지 않고 설치 진행.
여기서 정상 작동된다면 코드 내에서 있는 다운로드 과정과 충돌이 일어난다는 것이다.

<결과>
다시 에러가 발생한다.
failed to execute script due to unhandled exception 에러가 나온다.
이 에러는 pyqt5로 코드를 작성했을 경우
버전업 되면서 충돌될 경우에 나온다. 버전을 다운그레드하면 해결된단다.
아니면 상대경로를 절대경로로 바꿔주면 된단다.
connectionrefusederror다. ftplib 이나,
socket 라이브러리가 설치가 안되어서 그런가 싶었는데,
그 라이브러리들은 내장라이브러리기 때문에 따로 설치할 필요가 없다.

■■■■■■■■■■

<문제>
여전히 사용자에게 CLI 환경은 익숙치 않으며 어렵다.
계속해서 문의가 오는 중이다.

<가정>
그 어려움 중에는 오타의 문제도 있을 것이다.
메뉴얼대로 입력을 해도 가끔 에러가 발생하는 것은,
명령문이 길다보니까 작은 오타하나 때문에
다음 스텝으로 넘어가지 못하고,
사용자는 그 문제가 어디서 발생한 것인지 알 수없어,
어찌할 바를 몰라하는 것이다.
그런 경우 ~/.bashrc 에 알리아스를 등록하면 더 쉽게 사용할 수 있을 것이다.

<결과>
10개 이상의 명령문에 대해 alias를 등록했고,
개발자 입장에서도 매우 편하다.

■■■■■■■■■■

<문제>
ftplib.py line 152 error and socket.py line 727 error.

<가정>
통신 문제가 아닐까?
내가 wifi 설정에서 뭔가를 잘못한 것일까?

<실험>
wifi 설정을 다시 확인하고 수정해봤는데도 뜬다.

<가정>
그럼 소켓의 문제인가?
소켓이 문제라면 이전에는 문제 없다가 갑자기 뜨는 이유가 뭘까?

<가정>
rc.local 파일의 문제인가?

<실험>
rc.local 파일을 수정해보았는데 그래도 안된다.

<가정>
업데이트하는 순서가 잘못되었나?

<실험>
업데이트 순서는 그대로 하되, sh 부분에서 위의 코드 실행의 차이 때문에 에러가 생긴것 같다. 다시 해보니 된다.

<가정>
설마 라즈베리파이 이미저의 문제인가?

<가정>
정상 작동하는 서비스와 에러나는 서비스의 pip --version, python --version, pip list를 확인해봤는데 똑같다.
다른 곳에서 차이가 나는 것이다.

<가정>
성장 작동하는 서비스 파일과 에러나는 서비스 파일이 다르다?

<실험>
두 서비스 파일의 사이즈는 같다.

<결과>
결국 이 서비스의 문제는 서버의 문제였다. 서버만 정상적으로 켜져있으면 문제가 안되었다.
vpn이 제대로 연결되어 있고, mavlink 만 제대로 되어 있다면.

■■■■■■■■■■

<문제>
라즈비안 OS 재설치 했는데 랜이 안잡힌다.

<결과>
wpa 파일에서 interface를 intgerface 라고 오타가 있었다.

■■■■■■■■■■

<문제>
디스크 이미지 구우려하는데, disk is not large enough for the specified image 메시지 뜸.

<해결>
노트북에 여유 용량이 없어서 뜬 에러

■■■■■■■■■■

<문제>
나는 sixfab까지 완료된 이미지를 배포하고 싶은데,
usim 개통된 이통사 apn을 입력하면 그에 따라서 ppp를 다시 설치해야한다.

<가정>
완료된 이미지에서 이통사 정보만 수정하면 안되나?

<결론>
모든 파일들의 변수를 관할하는 하나의 변수모음 파일을 만들자.
설치 이후에도 그 변수모음 파일을 통해 커스터마이징 할 수 있도록 하자.
이렇게 하는 것이 좋은 이유는, 사용자 입장에서도 이 변수모음 파일만
복사해서 쓰면 같은 설정일 때 여러번 손대지 않아도 되는 것이다.

■■■■■■■■■■

<문제>
chmod로 권한 설정해줄 때 install_sdas 파일이 아직 없는 상태에서 그 권한을 부여하면 생성이 안된다.

<결론>
그래서 나중에 설치할 파일 옴겨놓고 다시 권한을 부여해 줘야되.

■■■■■■■■■■

<문제>
이미 설치 완료된 SD card를 복제해서 쓰면 왜 로컬 연결이 안되나?

<가정>
그럴리가 없다. 완전 똑같은 클론이면 기능이 똑같이 동작해야한다.
SD card 외적으로 내가 건들이거나 빠뜨린 게 있을듯.

<결론>
사소한 순서를 바꿔서 했다. 똑같은 순서로 빠짐없이 하면 똑같이 동작한다.

■■■■■■■■■■

<문제>
sixfab 설치 때문에 인터넷연결이 필요하고,
부팅 시간이 길어진다.
사용자에게는 번거롭고 어려운 작업이어서 장애가 된다.

<가정>
만약 sixfab 설치를 내재화 할 수 있다면,
사용자의 불편함이 줄어들 것이고,
우리 서비스를 이용함에 있어서 인터넷 의존성 줄어들며,
속도가 빨라질 것이다.

<결론>
sixfab 설치 과정에서의 커스터마이징을
미리 우리 제품에 다 반영해두고 인터넷 없이도
사용자가 파라미터를 변경해서 쓸 수 있게 만들자.
변수모음 파일안에서 다른 파라미터와 마찬가지로
변경할 수 있도록.
sixfab 설치과정에서 우리가 쓰지 않는 과정은 삭제하여
우리만의 sixfab 설치와 커스터마이징 코드를 만들어 최적화시키자.

■■■■■■■■■■

디버깅 노트 작성법
코드의 의도
문제점
검색, 정보 수집, 가설 세우기
실험설계
테스트
피드백

■■■■■■■■■■

디버그 체킹루틴

1. 선 접촉이 불량이 아닌가?
2. 포트가 제대로 꽂혀있나?
3. 전원 공급이 잘 되고 있나?
4. OS의 문제가 아닐까?
5. 버전 맞는 apt 깔렸나?
6. 버전 맞는 pip 깔렸나?
7. 통신의 포트번호는 제대로 입력되었나?
8. 변수명은 일치되어있나?
9. 오타는 없나?
10. 어느 파일, 어느 위치에서의 에러인가?
11. 에러 메시지 구글검색, ChatGPT 검색 또는 코드에서 검색
12. debug_print() 함수 만들어서 함수나 코드 줄마다 넣어놓기
13... 아 적다보니 너무 많다.

■■■■■■■■■■

<문제>
기존의 설치과정은 두 부분의 나뉘었다.
설치파일 제작 과정 상의 설치와 사용자의 설치.
그렇게 하면 버전의 문제라든지, 종속성 문제라든지,
사용자의 어려움, 그 민원에 대응하는 우리의 난처함 등이 많았다.
A -> B -> C 과정을 거쳐서 설치가 이뤄졌다.

<해결>
사실상의 모든 설치를 A -> B 과정에 녹여냈다.
사용자는 정말 손가락만 까딱하는 정도로 바로 사용할 수 있도록
수정했다.
기존 설치 과정에서 기존의 python code를 쉘 스크립트로 바꾸라는
명을 받았다. 왜 그래야는지 딱히 납득이 되지 않았지만,
이 막 들어온 내가 딴지거는 모양새로 보이기 싫어 그냥 따랐다.
그래서 설치과정을 단순화하면서 python code의 70% 가량을
쉘 스크립트로 바꾸었다.
수 없이 테스트했고, 지금은 빨리 재배포를 하고 싶은 마음이다.
이 프로그램이 만들어진지 5년만이고,
내가 수습기간을 끝내기 전의 일이다.

■■■■■■■■■■

<문제>
파이썬에서 txt, config 파일 등을 읽어와서 수정하는 코드를
쉘 스크립트로 바꾸기

<해결>
sed 명령어를 이용하면 된다.

■■■■■■■■■■

<문제>
Sixfab을 사용자가 설치하게하면 실패율이 높다.
헷갈리고 어려워서 계속 문의가 오는 편이다.
뿐만 아니라 인터넷이 연결되지 않은 상황에서는
설치 자체가 불가능하다.
그래서 우리가 설치해서 배포하려고하면,
사용자 각각의 개별 환경에 맞게 세팅해서 설치해야 하는데
그렇게 배포할 수는 없다.
어차피 사용자의 개입이 필요하게 된다.

<가정>
설정에 따라 설치가 어떻게 달라지는지 확인하여,
Sixfab 설치 코드를 우리 회사에 맞게 커스터마이징 하는게 낫겠다.

<실험>
Sixfab 설치 코드(ppp_install_standalone),
파일의 이동/복사 경로,
설정값이 들어가는 경로
를 모두 확인했다.
모든 것들을 확인하고 정리해보니까
복잡한 구조가 눈에 보였고 커스터마이징이 가능해보였다.

<해결>
설치 코드를 뜯어보고 우리 회사에 맞지 않는
불필요한 코드는 다 삭제했고, 사용자에게 필요하지 않은 코드도
다 우리 제품에 맞게 픽스해서 안 보이게 했다.
사용자가 꼭 설정해야만하는 파라미터를 추출했다.
그리고 설치에 필요한 파일은 모두 다운받아서
인터넷이 필요없도록 했고,
사용자가 설정해야하는 모든 경우의 수에 대해 설치가
미리 되어있도록 했다.
디렉토리를 따로 만들어서 사용자 선택에 따라 스위칭해서 가져오도록했다.
설정을 바꾸려면 재설치를 해야하는게 기존의 방법이었다면,
지금은 설정을 바꾸면 그만이다. 설정을 바꾸고 세팅을 다시하면 재부팅하면서
설정을 바꾸도록 만들었다. 기존의 세팅을 다 리셋하고 새롭게 세팅하도록
만들어서 설정들이 꼬이는 위험을 없앴다.

■■■■■■■■■■

<문제>
Sixfab 설치 내재화를 진행함에 있어서
파일 수정 권한 문제가 생겼다.
대다수를 자동화해서 사용자가 편리하도록 바꿨는데
이것만 덩그러니 사용자의 몫으로 남겨놓을 수는 없다.

<해결>
파일을 수정하는 대신 덮어쓰는 방법을 택했다.
백업파일을 2개 만들어서 원본파일, 수정파일로 구성하고
대상파일을 덮어썼다.

■■■■■■■■■■

<문제>
sudo make -j4 코드에서 warning이 발생했다.
-j4는 더 빨리 컴파일하기 위해 멀티코어를 쓰라는 명령이다.

<가정1>
멀티 코어의 문제다.

<가정2>
컴파일의 문제거나 configure의 문제다.

<실험1>
-j4를 지우고 sudo make로 하려하니 make: Nothing to be done for 'all' 에러가 발생했다.
make clean으로 기존 컴파일 지우고 다시 시도하니까 프로세스 진행된다.
하지만 역시 warning 발생.

■■■■■■■■■■

<문제>
.sh 설치 설정파일에서 뒷부분 /home/pi/ 디렉토리 관련 몇몇 코드를 건너뛴다.
앞에 cd ~를 달아도 그렇고. cd $HOME을 달아도 그렇다.

<해결>
그냥 안전하게 절대 경로로 지정해줬다.
설치경로가 달라지는 경우는 용인해야할 부분이 아니라,
수정해야할 부분이다. 경로를 확정하는게 맞다.

■■■■■■■■■■

<문제>
야외에 나가서 RTK Base(F9P)를 켰다.
전에는 프로그램에 GPS가 잡혔었는데 이번엔 안잡힌다.
그 사이에 다음과 같은 변화가 있었다.
Device 프로그램에서 파라미터 config 파일과 그 파라미터를 쓰는 코드들을 수정했다.
제어 PC 프로그램에서 몇몇 코드를 수정(내 담당이 아니다)해서 재빌드했다.
Device 프로그램과 제어 PC 프로그램에서 버전정보를 바꾸었다.

<가정1>
Device 단에서 실수가 있었거나

<가정2>
서버쪽 코드 수정에 실수가 있었거나

<가정3>
제어 프로그램 쪽에서 실수가 있었거나

<가정4>
빌드 과정에서 실수가 있었거나

<가정5>
RTK Base 가 고장났거나

<가정6>
USB 선 따위가 접촉불량이거나

<가정7>
U-bolx 세팅이 잘못되었거나

<토의>
Device 단에서는 애초에 이전과 별로 다를바가 없었다.
그리고 내가 수정하면서 꼼꼼히 확인했기에 실수가 없다고 확신했다.
이전에는 바로 잡혔던 RTK가 바로 안뜬다는게 의아했다.
그 사이에 RTK를 바닥에 내던지거나 한 적도 없고, RTK 세팅이
갑자기 제멋대로 틀어지는 것도 상식 밖이다.
그래서 나는 코드 수정에 문제가 있었다고 보았다.
그런데 우리의 리더는 코드 쪽 문제는 아니라고 보았다.
처음에는 빌드의 문제라고 짚었는데, 내가 빌드를 여러 번 거듭하면서
마지막에 빠짐없이 체크하고 빌드하였기 때문에 빌드의 문제는 아니라
생각했다.
여차저차 하다가 우리는 선의 문제라고 잠정결론을 지었다.
리더는 U-bolx 세팅을 다시 하겠다고 한참을 헤매었다.
나는 다시 예전 Device 소스로 RTK를 켜봤는데, 여전히 되지 않았다.
나는 서버나 제어프로그램 쪽의 문제라고 더욱 확신하게 되었다.

<결론>
다음날 출근하니 RTK가 잡혔다. 밤새 리더께서 원인을 찾으셨다.
아니나 다를까 제어프로그램 쪽에서 미션플래너 코드를 싸그리 지워버린 거였다.
그러니까 당연히 안들어오지.

■■■■■■■■■■

<문제>
main 서비스를 구동시키는 파일을
실행시키면 꾸 [errno 111]
connection refused 에러가 발생한다.
해당 서비스가 가리키는 경로가
그 서비스를 구동하는 파일을 가리키지 않고
엉뚱한 위치를 자꾸 가리킨다.
경로를 직접 수정해줬는데도 똑같은 일이 발생한다.
main service가 돌지 않는다면

<가정1>
main service 파일이 이전과 다르게 잘못되었거나

<가정2>
선행될 서비스(mavlink)가 안돌거나

<가정3>
openvpn 이 안돌아서 ppp가 안올라왔거나

<가정4>
운영 PC의 서버가 openvpn이 꺼졌거나

<가정5>
운영 PC의 서버(프로그램)가 꺼졌거나

<결과>
모두 체크해서 정상작동하면
정상작동 해야하는데 그렇지 않았다.
문제는 프로그램 명이다.
해당 프로그램은 다른 디렉토리에 백업파일과 사용하는
파일이 따로 있었는데 자꾸 서비스 돌릴 때
원래 실행파일이 아니라 백업 파일 쪽으로 경로가
바뀌어서 프로그램 실행 경로가 다 틀어져서 엉망이 되는 것이었다.
이유는 모르겠다. 왜 그런지.
암튼 백업파일의 이름을 바꿔주자 문제가 해결되었다.

■■■■■■■■■■

Posted by ssanatos
,