DOUG 로이드 : 좋아 GDB. 정확히 무엇입니까? 서 그래서 GDB, GNU 디버거, 정말 멋진 도구는 우리가 할 수있다 우리의 프로그램을 디버깅 우리를 도와 사용, 또는 일이 어디 있는지 알아 우리의 프로그램에서 잘못된 것. GDB가, 놀라 울 정도로 강력하지만, 그것으로 출력과 상호 작용 조금 애매 할 수있다. 보통 명령 줄 도구이고, 그것은 당신의 메시지를 많이 던질 수 있습니다. 그리고 그것은 종류의 하드에 수 무슨 일을 정확히 분석합니다. 다행히도, 우리가 촬영 한 단계 당신을 위해이 문제를 해결하려면 당신은 CS50를 통해 작업 할 때. 당신은 그래픽을 사용하지 않는 경우 디버거,하는 내 동료 댄 Armandarse 꽤 말씀 비디오에 대해 조금 그 이상 여기에 있어야한다 지금, 당신이해야 할 수도 있습니다 이 명령 줄을 사용하는 도구는 GDB와 함께 작동합니다. 당신은 CS50에서 작업하는 경우 IDE는, 당신은이 작업을 수행 할 필요가 없습니다. 하지만 당신은하지 않은 경우 CS50 IDE에서 작업 아마도 버전을 사용 CS50 어플라이언스, 또는 다른 리눅스 운영 GDB와 시스템은이 설치 당신은 사용해야 할 수도 있습니다 명령 행 도구를 제공합니다. 이후 당신은 수도 그건, 그렇게해야 다만 방법을 이해하는 데 유용 GDB는 명령 줄에서 작동합니다. 그러나 다시, 당신은이 있다면 CS50의 IDE를 사용하면 그래픽 디버거를 사용할 수 있습니다 그는 IDE에 내장되어 있습니다. 그래서 일이 함께 가야합니다 GDB는 디버깅을 시작합니다 특정의 과정 프로그램, 모든 당신이 할 필요 GDB는 다음에 입력된다 프로그램 이름. 그래서 예를 들어, 프로그램이있는 경우 안녕하세요, 당신은 GDB의 안녕을 입력합니다. 당신이 작업을 수행 할 때, 당신은거야 GDB 환경을 당깁니다. 프롬프트가 변경됩니다 대신되는 보통 무엇을 당신이 일을 입력 할 때입니다 명령 line--의 LS에, 전형적인 모두 cd-- 리눅스는 프롬프트 명령 아마 뭔가로 변경됩니다 괄호처럼 GDB는 괄호. 그 때문에, 새 GDB 프롬프트의 당신은 GDB의 환경 내에서입니다. 일단 그 환경의 내부, 두 가지 명령이있다 당신은 아마 사용하는거야 다음 순서. 제 B는, 어느 휴식을위한 짧다. 그리고 당신은 B를, 당신이 일반적으로 입력 한 후 함수의 이름을 입력 또는 당신이 알고있는 일이면 무엇을 줄 수 주변 프로그램이 시작 조금 이상한 행동, 당신은 줄을 입력 할 수 있습니다 수있을뿐만 아니라. 무엇 B, 또는 휴식, 수행 입니다 그것은 당신의 프로그램을 할 수 있습니다 특정 시점까지 실행하려면 함수 즉, 이름 당신은 지정하거나 줄 것을 사용자가 지정한 번호. 그리고 그 시점에서, 그것을 실행을 정지합니다. 이 때문에, 정말 좋은 일이 실행이 냉동 된 후, 당신은 매우 천천히 시작할 수 있습니다 당신의 프로그램을 통해 단계. 당신이왔다면 일반적으로 실행 프로그램, 그들은 매우 짧은입니다. 일반적으로, 당신은 점 슬래시를 입력 무엇이든 프로그램의 이름은, Enter 키를 누르된다 당신은 깜박하기 전에, 당신의 프로그램은 이미 완료됩니다. 정말 시도하는 많은 시간이 아니다 잘못된 무슨 일이 일어나고 있는지 알아. 정말 일을 느리게 할 수 있도록 아래 B에 브레이크 포인트를 설정하여, 다음에 스테핑. 당신은 당신의 휴식을 설정 한 다음에 한 번 포인트는, 당신은 프로그램을 실행할 수 있습니다. 그리고 당신은 어떤이있는 경우 명령 줄 인수, 당신은 여기를 지정하지 않을 경우 당신은 당신의 프로그램 이름 GDB를 입력합니다. 당신은 모든 명령 줄을 지정 R, 또는 실행을 취함으로써 인수, 다음 어떤 명령 행 인수 당신은 당신의 프로그램의 내부에 필요합니다. 기타의 수는 정말로있다 중요하고 유용한 명령 국내 총생산 (GDP) 환경의 내부. 그러니 빨리 저를 보자 그 중 일부를 통해 이동합니다. 먼저, 다음의 약자 N이며 당신은, 다음 N 대신 입력 할 수 있습니다 모두 작동합니다. 그리고 그것은 단지 속기입니다. 그리고 당신은 아마 이미 들어 왔로 일을 입력 할 수있는, 사용 짧은은 일반적으로 더 낫다. 그리고 무엇을 할 것 것은은 것입니다 코드 블록 전진 한 단계. 그래서 앞으로 이동합니다 함수를 호출 할 때까지. 그리고 대신 그 기능에 다이빙 그 모든 기능을 겪고 코드, 그냥 기능을 제공합니다. 함수가 호출됩니다. 그것은 그 일이 무엇이든 할 것입니다. 이 값을 반환합니다 를 호출 한 함수. 그리고 당신은로 이동합니다 그 호출 함수의 다음 라인. 당신은 단계하려면 함수의 내부, 대신 데 이는 특히, 실행할 당신은 문제가 아니라고 생각하면 그 함수의 내부 거짓말 수 있습니다, 당신은 물론, 휴식을 설정할 수 있습니다 내부에 그 기능을 가리 킵니다. 이미 실행중인 경우 또는, 당신은 할 수 코드 앞으로 한 줄 단계의를 사용합니다. 그래서이 개입됩니다 과 기능에 다이빙, 대신 바로 실행이 및 기능에에 계속 당신은 디버깅에 걸. 혹시 알고 싶다면 변수 값, 당신은 p 또는 인쇄를 입력 할 수 있습니다, 다음 변수 이름. 그리고는, 당신을 인쇄한다 GDB 환경의 내부, 변수의 이름, 그 있는데 ... 가구 있구만에게 변수의 값을 변명 당신의 이름은 적이있다. 당신은 모든의 값을 알고 싶다면 곳에서 지역 변수 접근 당신은 현재에있는 당신의 이 프로그램은, 당신은 정보의 지역 주민을 입력 할 수 있습니다. 그것은보다 훨씬 빠르다 다음 페이지를 입력하고 무엇이든, 모두를 나열 당신이 존재하는 것으로 알고 변수. 당신은 정보의 지역 주민을 입력하고, 수 당신을 위해 모든 것을 인쇄합니다. 다음은 인 BT는있다 역 추적에 대한 짧은. 이제 일반적으로, 특히 초기 CS50에서, 당신은 정말 기회가되지 않습니다 BT, 또는 역 추적을 사용하려면, 당신은 기능을 가지고 있지 있기 때문에 즉, 다른 함수를 호출합니다. 당신은 주요 통화가있을 수 있습니다 기능은,하지만 그건 아마입니다. 당신은 다른 기능이없는 다른 함수를 호출하는 다른 함수를 호출, 등등. 하지만 당신의 프로그램이 더 얻을로 복합, 특히 당신은 작업을 시작할 때 재귀와 다시 추적 당신이 할 수있는 정말 유용한 방법이 될 수 있습니다 가지에 대한 몇 가지 컨텍스트를 얻을 내 프로그램입니다. 그래서 당신은 당신의 코드를 작성했다고 가정하고, 당신은 메인 함수를 호출하는 것을 알고 함수를 호출 F, 함수 h를 호출 g. 그래서 우리는 여러 레이어를 가지고 중첩 여기에 무슨. 당신의 내부에 있다면 당신의 GDB 환경, 당신은 당신의 내부를 알고 시간의,하지만 당신은 잊지 당신이 어디에 당신을 가지고 일에 대해 당신은 BT, 또는 다시 추적을 입력 할 수 있습니다으로 죠, 그리고, H, G에서 주요 F 인쇄합니다 다른 정보와 함께하는 당신에게 단서를 제공하는 확인 주 라는 F가 호출 G F, G, H라는 그리고 그 곳의 I 현재 내 프로그램입니다. 그래서, 정말 유용 할 수 있습니다 특히 GDB의 수수께끼 - 다움으로 에, 조금 압도된다 상황이 정확하게 곳을 찾을 수 있습니다. 마지막으로, 프로그램이 완료되면, 작업이 완료되면하거나 디버깅 그리고 당신은 멀리 단계로 원하는 GDB 환경에서, 그것은 나가하는 방법을 알고하는 데 도움이됩니다. 당신은 질문을 입력하거나 벗어나고, 종료 할 수 있습니다. 자, 오늘의 비디오 전 나는 버그가 프로그램을 준비 내가 컴파일이라고 buggy1, buggy1.c로 알려진 파일. 당신이 예상 한대로 이 프로그램은 사실 버그입니다. 뭔가 잘못 때 시도하고 실행합니다. 지금, 불행하게도, 내가 실수 내 buggy1.c 파일을 삭제 그래서 위해 나를 파악하는 무슨 일이,이 프로그램 잘못된거야 내가 사용해야하는거야 GDB는 가지 맹목적으로, 시도 이 프로그램을 통해 이동합니다 잘못된거야 정확히 파악. 그러나 단지 도구를 사용하여 우리는 이미에 대해 배웠다 우리는 꽤 많은 그림을 수 그것이 정확히 무엇인지. 그럼으로 향할 수 있도록 CS50 IDE와는 모양을 가지고있다. 좋아, 그래서 우리는 여기에있어 내 CS50 IDE 환경 나는 조금 확대합니다 그래서 당신은 조금 더 볼 수 있습니다. 내 터미널 창에서, 나는 게시하면 나의 현재 이사의 내용 LS와 함께, 우리는 내가를 볼 수 있습니다 소스 파일의 몇 가지있다 여기에 포함 이전 buggy1을 논의했다. 정확히 어떤 경우에 간다 나는 시도하고 buggy1를 실행합니다. 음의 알아 보자. 나는 점 슬래시를 입력 버그, 나는 Enter 키를 누르십시오. 분할 오류. 그 좋지 않다. 당신이 기억하는 경우, 세그먼트 오류 일반적으로 우리가 메모리에 액세스 할 때 발생 우리는 접촉을 허용하지 않을 것이다. 우리는 어떻게 든 도달했습니다 경계의 외부 어떤 프로그램, 컴파일러는, 우리에게 주신. 그리고 이미 그건 단서는 도구 상자에서 유지 우리는 디버깅 프로세스를 시작하기로. 뭔가 여기에 약간의 잘못을왔다. 좋아, 그렇게하자의 시작 GDB 환경까지 우리가 알아낼 수 있다면 참조 정확히 문제이다. 나는 나의 화면을 취소거야 나는 GDB를 입력 할거야 다시, GDB 환경을 시작하는, 및 프로그램의 이름 나는 buggy1을 디버깅 할 것이다. 우리는 독서, 작은 메시지가 buggy1에서 기호, 수행. 즉, 모두가 당겨 함께 모든 코드, 그리고 지금은에로드 된 것 GDB는하고 갈 준비가입니다. 지금, 나는 무엇을 하시겠습니까? 당신은 무엇을 기억하십니까 첫 번째 단계는 전형적 나는이 환경의 내부에있어 후? 바라건대, 당신은 상기 집합 중단 점 때문에 사실 그게 내가하고 싶은 것입니다. 지금, 나는이 없습니다 이 소스 코드 내 앞에, 이는 아마도 하지 일반적인 사용 사례, 그런데. 당신은 아마 것이다. 그래서 좋다. 그러나 가정하면되지, 무슨 일이야 할 당신이 알고있는 하나의 기능 모든 단일 C 프로그램에 존재? 아무리 큰 또는 얼마나 복잡 그것이,이 기능은 분명히 존재한다. 홈페이지 오른쪽? 그래서 다른 모든, 우리가 할 수있는 실패 메인에서 브레이크 포인트를 설정합니다. 그리고 다시, 난 그냥 입력 할 수 있습니다 대신 B의 메인 휴식. 그리고 당신은, 궁금 경우 경우 지금까지 긴 명령을 입력 다음 실현 잘못된 일을 입력, 당신은 없애 싶어 모든 난 그냥 그랬던 것처럼, 당신은 어떤 것, 제어 U 걸릴 수 있습니다 모든 것을 삭제하고 다시 가져 커서 라인의 시작. 단지를 누른 상태에서보다 더 빨리 많은 삭제, 또는 그것을 무리 번 타격 이상. 그래서 우리는 주에서 브레이크 포인트를 설정합니다. 그리고 당신이 볼 수 있듯이, 우리가했습니다 말한다 파일 buggy1.c에서 브레이크 포인트를 설정, 분명히 첫 번째 줄 주의 코드의 라인 일곱입니다. 다시 말하지만, 우리는이 없습니다 여기 소스 파일, 그러나 나는 그것이 있다고 가정합니다 나에게 진실을 말하고. 그리고, 난 그냥 노력하고있어 및 R, 프로그램을 실행합니다. 프로그램 시작. 좋아요,이 메시지 조금 애매하다. 그러나 기본적으로 무슨이다 여기에서 일어나고있는 것은 단지입니다 내 휴식을 명중했습니다 말해 포인트, 브레이크 포인트 번호 1. 그리고, 코드의 라인, 그런 파일이나 디렉토리가 없습니다. 유일한 이유는 그 나는 그 메시지를보고 있어요 이다 내가 실수 때문에 내 buggy.c 파일을 삭제했습니다. 내 buggy1.c 파일이 존재하는 경우 현재 디렉토리에, 이 실제로 것이라고 라인 오른쪽 말해 무엇 코드의 라인 말 그대로 읽습니다. 불행하게도, 나는 그것을 삭제. 우리는 종류의 탐색해야 할거야 더 맹목적이 조금 통해. 좋아, 그럼 어디 보자, 무엇을 여기할까요? 글쎄, 난 지역 무엇을 알고 싶습니다 변수는 아마 나에게 사용할 수 있습니다. 내 프로그램을 시작했습니다. 이제가 무엇인지 살펴 보자 이미 우리를 위해 초기화. 나는 정보를 지역 주민, 아니 지역 주민을 입력합니다. 좋아, 즉하지 않도록 나에게 정보의 톤을 제공합니다. 나는 시도하고 변수를 출력 할 수있다, 하지만 난 어떤 변수 이름을 알고하지 않습니다. 나는 다시 추적을 시도 할 수 있습니다, 하지만 주 안에 있어요, 그래서 나는 내가 만든하지 알고 지금 다른 함수 호출. 내 유일한 옵션은 같은 보인다 N 정도 사용하고 다이빙을 시작합니다. 나는 N을 사용하는거야. 그래서 n을 입력. 맙소사, 무슨 일이 일어나고있다. 프로그램은 신호를 수신, SIGSEGV 분할 오류, 다음 물건의 전체 무리. 이미 압도 해요. 음, 사실 거기 많은 여기에 배울 수 있습니다. 그래서 이것은 우리에게 무엇입니까? 무엇이 우리에게하는이 프로그램은,이다 약하지만,이 아직, SEG 오류. 특히, 내가 갈거야 더욱 여기에 확대, 그것은 약 오류를 SEG에 관하여 뭔가 strcmp와했다. 이제, 우리는 논의되지 않았을 수 있습니다 광범위하게이 기능을 사용하지 않음. 우리는하지 않을거야 때문에하지만은 ... - 모든 기능에 대해 얘기하고 그 C 표준에 존재 library-- 하지만 그들은 당신에게 사용할 수있는 모든 것 당신은 걸릴 경우 특히 reference.cs50.net 봐. 그리고 strcmp와는 정말 강력하다 내부에 존재하는 기능 string.h 헤더의 헤더는 파일, 기능에 전념 파일 와 그 작품과는 문자열을 조작 할 수 있습니다. 특히, 무엇을 strcmp가하는 것은 두 개의 문자열 값을 비교합니다. 그래서 오류를 치화에 대한이야 통화 보인다 strcmp와합니다. 나는 N 히트, 사실 나는 메시지가 프로그램 신호 SIGSEGV 종료 세그먼트 오류. 그래서 지금 실제로 세그 폴트 한 내 프로그램이 꽤있다 훨씬 효과적으로 포기. 이 프로그램을 종료한다. 그것은 고장, 그것은 추락했다. 그래서 많은 아니었지만, 나는 실제로 꽤 배웠다 이 작은 경험. 나는 무엇을 배웠는가? 글쎄, 내 프로그램이 충돌 즉시 꽤 많이. 내 프로그램에 충돌 strcmp와 위해 전화,하지만 임의의 지역 변수가없는 내 이 충돌시에 프로그램. 그래서 문자열, 또는 문자열, 나는 아마도 비교 될 수있다. 나는 어떤 지역이없는 경우 변수, 당신은 수도 어쩌면이다 내가 거기에 잔 마셔요 것으로 추측 사실이 될 수있는 전역 변수. 그러나 일반적으로 보인다 같은 나는 비교 해요 존재하지 않는 뭔가. 그래서 조사하자 조금 더 그. 그래서 난 내 화면을 취소하겠습니다. 나는 밖으로 종료거야 초 GDB 환경을 제공합니다. 그리고 확인, 생각, 그래서 거기에 내 프로그램에서 로컬 변수가 없습니다. 나는이 통과되어있어 어쩌면 궁금 명령 줄 인수로 문자열. 그래서 그냥이를 테스트 할 수 있습니다. 내가 전에 이런 짓을하지 않았습니다. 나는이 프로그램을 실행 아마도 경우 경우 보자 명령 행 인수와 함께 작동합니다. 허, 거기에없는 세그먼트 오류. 그것은 단지 내가 그것을 알아 낸 것을 저에게 말했다. 그래서 아마 그 수정은 여기. 내가 돌아가서 만약 실제로 보면 buggy1.c 실제 소스 코드, 내가 뭘하는지는 것처럼 보인다 나는없이 strcmp와의 호출을 만들고있어 실제로는 argv [1]의 존재 여부를 검사. 이것은 사실이다 buggy1.c에 대한 소스 코드. 그래서 정말로 필요 내 프로그램을 해결하기 위해 여기에서, 가정 내가 가진 입니다 내 앞에 파일 다만 확인하기 위해 검사를 추가 확인하십시오는 argc 2와 같다. 그래서 예, 다시 나는, 말한 것처럼 바로 조금 인위적인입니까? 당신은 일반적으로하지 않을거야 실수로 소스 코드를 삭제 다음 시도해야 및 프로그램을 디버깅. 그러나 희망, 그것은했다 당신 그림 물건의 종류의 당신에 대해 생각 할 수 당신은 당신의 프로그램을 디버깅하고 있습니다. 여기에 문제의 상태는 무엇입니까? 어떤 변수 내가 할 나에게 접근 할 수 있나요? 어디 정확히 내 프로그램입니다 어떤 라인에 충돌, 어떤 기능에 어떤 통화? 단서 어떤 종류의 그 날을 주는가? 그리고 정확히이다 사고 종류의 당신을 당신이있을 때 들어갈해야 프로그램을 디버깅에 대한 생각. 나는 더그 로이드입니다. 이 CS50입니다.