IDE를 찾을 때마다 (현재 Go와 함께 고민하고 있습니다) Vi, Emacs, Notepad ++ 등을 추천하는 사람들로 가득 찬 스레드를 찾습니다.
IDE 외부에서 개발 한 적이 없습니다. 내가 망친 것 같아 IDE없이 어떻게 디버깅합니까? 로깅만으로 제한되어 있습니까?
IDE를 찾을 때마다 (현재 Go와 함께 고민하고 있습니다) Vi, Emacs, Notepad ++ 등을 추천하는 사람들로 가득 찬 스레드를 찾습니다.
IDE 외부에서 개발 한 적이 없습니다. 내가 망친 것 같아 IDE없이 어떻게 디버깅합니까? 로깅만으로 제한되어 있습니까?
답변:
디버거를 사용합니다. 대부분의 경우 이것은 IDE가 배후에서 수행하는 작업이기도합니다. GUI의 경험을 감싸는 것입니다.
Unix에서 가장 일반적으로 사용되는 디버거 중 하나는 GNU gdb
이며, 이는 이전의 Unix 디버거 (예 :)를 대체했습니다 dbx
.
명령 행에서 디버깅의 모양과 느낌에 대한 아이디어를 얻으려면 gdb 매뉴얼을 참조하십시오 .
다른 영역과 마찬가지로 명령 줄에서 디버거를 사용하려면 구문과 명령 집합을 학습해야하지만 많은 유연성과 스크립팅 기능이 필요합니다. 반면 vim 또는 emacs와 같은 편집기에서 작업하는 것이 편한 경우 즐겨 사용하는 편집기에 즐겨 사용하는 디버거에 대한 플러그 인이있을 수 있습니다.
pdb
실제로 내가 찾은 IDE 디버거보다 낫습니다.
ipdb
그것보다 낫다;)
그래픽 드라이버를 작성하는 동안 몇 년 동안 디버거를 사용했습니다. 그래픽 컴퓨터가 고장 났을 때 기본 컴퓨터의 화면이 작동하지 않기 때문에 첫 번째 컴퓨터에 대해 디버거를 실행하는 두 번째 컴퓨터가 있습니다. 코드를 중지하고 하드웨어가 걸려있는 지점까지 올라가서 무슨 일이 일어나고 있는지 알 수 있어야했습니다.
순전히 소프트웨어 문제의 경우 문제에 대해 생각하고 문제에 대해 더 많이 알기 위해 시스템을 테스트하는 것이 한 줄씩 코드를 단계별로 실행하는 것보다 훨씬 유용합니다. print 문을 사용하면 명령 줄이나 로그 파일에서 발생한 모든 것을 나열하여 디버거로 할 수있는 것보다 더 쉽게 앞뒤로 이동할 수 있습니다.
가장 어려운 버그는 일반적으로 컴퓨터에서 발생하는 문제를 이해함으로써 해결됩니다. 때로는 종이나 화이트 보드가 있고 때로는 다른 일을하면서 답이 드러납니다. 가장 까다로운 버그는 Where 's Waldo 재생과 같은 코드를주의 깊게 보면 해결됩니다. 나머지는 모두 print 문이나 logging 문으로 가장 쉬운 것처럼 보입니다.
사람마다 스타일이 다르며 작업마다 다른 스타일이 더 좋습니다. 인쇄 문이 반드시 디버거에서 내려진 것은 아닙니다. 당신이하고있는 일에 따라 더 나아질 수 있습니다. 특히 네이티브 디버거가없는 언어 (Go?)
going backwards
. 나는 종종 경험이 : "이봐 - waittaminute이 오른쪽 값이 아닌 않은 방법 이 될 이 ?"하고 코드를 읽는 동안 출력에왔다 갔다해야합니다. 디버거는 거꾸로 나쁘다.
어떤 사람들 은 커맨드 라인에서 gdb 를 사용 하거나 플러그인을 사용 합니다. DDD 와 같이 gdb에 대한 독립형 GUI 프론트 엔드도 있습니다 . 당신의 언어에 따라 특정 언어 독립 실행 형 디버거와 같은 GUI를,있다 Winpdb 파이썬, 또는 jswat 자바에 대한이. 이러한 프로젝트 는 디버깅 에만 중점을두기 때문에 통합 디버거보다 우수합니다.
IDE에 대한 다른 작은 비밀은 사용자 정의 편집기를 지정할 수있는 가치가 있다는 것입니다. 따라서 특정 작업에는 IDE의 일부를 사용할 수 있지만 편집에는 괜찮은 편집기를 사용할 수 있습니다. 디버거를 사용하기 위해 IDE를 시작하는 것은 드문 일이 아닙니다. 특히 동료가 모두 사용하는 경우에는 특히 그렇습니다.
printf 문을 사용하여 디버깅에 혐오감을 느끼는 이유를 이해하지 못합니다. 프로그램을 다시 컴파일하고 링크하는 데 시간이 너무 오래 걸렸지 만 오늘날에는 몇 초 밖에 걸리지 않습니다. cout, printf, qDebug () 등의 출력 유형을 사용하여 디버깅하는 것이 매우 쉽다는 것을 알았습니다. Printf 문은 프로그램이 수행 한 모든 작업의 실행 기록을 제공하므로 사실 후에 분석 할 수 있지만 디버거에서 실행하면 프로그램 실행시 수동으로 프로그램 흐름을 기억해야합니다. printf를 사용하면 변수 값을 특정 단위로 변환하고 16 진수, 10 진수 등으로 표시 할 수 있습니다. printf 문은 루틴 및 변수 이름과 행 번호를 나열 할 수 있습니다. 다른 변수에 따라 특정 배열 요소 만 나열 할 수 있습니다. 지시를 따를 수 있습니다. 출력을 매우 쉽게 제어 할 수 있습니다. 카운터에 넣고, 루프를 통해 특정 시간 만 인쇄하고, 디버깅 할 때 print 문을 추가 및 제거하고, 디버깅 출력 수준이 다르고, 파일에 쓰는 등의 작업을 수행하는 것보다 프로그램 기록을 보는 것이 훨씬 쉽습니다. 수동으로 밟은 모든 장소를 기억하고 프로그램이 수행 한 작업을 찾기 위해 시간이 지남에 따라 변수의 내용을 기록해야 할 수도 있습니다. 마지막으로 printf 문을 사용하면 향후 디버깅을 위해 영구적으로 켜고 끌 수 있습니다. 수동으로 밟은 모든 장소를 기억하고 프로그램의 내용을 찾기 위해 시간이 지남에 따라 변수의 내용을 기록 해야하는 것보다 파일에 기록 된 프로그램 기록을 보는 것이 훨씬 쉽습니다. 완료했습니다. 마지막으로 printf 문을 사용하면 향후 디버깅을 위해 영구적으로 켜고 끌 수 있습니다. 수동으로 밟은 모든 장소를 기억하고 프로그램의 내용을 찾기 위해 시간이 지남에 따라 변수의 내용을 기록 해야하는 것보다 파일에 기록 된 프로그램 기록을 보는 것이 훨씬 쉽습니다. 완료했습니다. 마지막으로 printf 문을 사용하면 향후 디버깅을 위해 영구적으로 켜고 끌 수 있습니다.
jimwise는 이 질문에 아주 잘 대답 했지만 전체 IDE없이 작업하도록 선택하면 Windows 용 Microsoft 제공 명령 줄 디버거는 CDB 라고 덧붙였습니다 . CDB에는 Windows SDK를 다운로드 할 때 GUI에 해당하는 WinDBG 를 포함한 다른 여러 도구가 제공됩니다 .
나는 보통 몇 주에 한 번씩 디버거를 사용하지 않지만 가장 먼저가는 것은 아닙니다.
내 직업에서 가장 중요한 도구는 너무나 어디에나있어서 거의 언급하지 않은 스택 추적입니다. 스택 추적을 검사하면 발생하는 문제의 90 % 이상을 해결할 수 있습니다. 이 도구는 귀하의 언어에 따라 항상 도움이되는 것은 아니지만, 언어에 의해 잘 구현되면 놀라운 시간을 절약 할 수 있습니다.
간단한 문제를 감지하는 가장 일반적인 두 번째 방법은 아마도 내가 방금 변경 한 코드 일 것입니다. 나는 단위 테스트를 자주 수행하기 때문에 내가 방금 깬 것을 일반적으로 알고 있습니다.
보다 복잡한 개발 및 디버깅을 위해 디버그 또는 추적 수준 로그 문을 추가 할 수 있습니다. 프로덕션 추적 / 디버그 로깅 정보를 배치하는 데 도움이되는 개발 문제를 좋은 안내서라고 생각합니다.
항상 디버거가 유용한 것은 아닙니다. 프로덕션 환경에서는 디버거를 실행하지 못할 수 있습니다 (Heck, 회사의 보안 수준에 따라 로그를 제외하고 프로덕션 시스템에 액세스하지 못할 수 있음). 디버거를 연결하는 데 너무 오래 걸리거나 사용 가능한 좋은 디버거가없는 언어도 있습니다.
로직 및 디버그 / 추적 레벨 로깅을 사용하여 코딩을 모두 수행 한 경우 하드웨어에 액세스하지 않고도 문제를 파악하기 위해 우수한 로그 명령문 (로그 레벨을 증가시킬 수 있음)을 검사하는 경우 일 수 있습니다.
디버거는 강력한 도구라고 생각하지만 도구 상자에서 유일한 도구로 사용하지 마십시오!
독립형 텍스트 편집기와 함께 IDE에서 디버거를 사용할 수없는 이유는 없습니다. 나는! Zap을 사용하여 편집하고 JBuilder는 다른 컴퓨터에서 디버깅하고 파일 서버는 지하실에서 사용했습니다. 전통적으로 디버거는 IDE를 따라 드래그하지 않고 독립 실행 형 프로그램이었으며 작동합니다.
포괄적 인 테스트가 디버깅을 대체한다는 점에 주목할 가치가 있습니다. 보고 된 버그를 코드가 아닌 테스트의 버그로 간주하는 것이 좋습니다.
또한 있습니다 printf
. 모든 줄에 대해 멈추지 않고 많은 양의 "로깅"을 작성하고 검색하는 것이 유용 할 수 있습니다. -Xbootclasspath/p:
Java 라이브러리 클래스를 해킹 하는 등의 방법 으로 프로덕션에서 수정할 수없는 라이브러리 클래스를 수정할 수있는 경우 특히 유용합니다 .
펜과 종이를 사용하거나 문제에 대해 생각하면서 컴퓨터에서 최상의 문제를 해결할 수 있다는 데 동의하십시오. 이것은 라이브 디버거를 사용하는 것보다 더 유용합니다. 종종 사고 과정을 수정합니다.
간단한 사용자 인터페이스를 기반으로하는 콘솔 인 pudb 를 사용할 수 있습니다 . REPL을 입력하고 더 자세히 검사하려면 pdb 또는 ipdb와 같은 선호하는 디버거를 선택할 수 있습니다.
또한 더 포괄적 인 도구 모음을 보려면 PythonDebuggingTools Wiki 를 확인하십시오 .