안녕하세요,
네 이번 강의에서는 콜 스택에 대해 좀 알아보겠습니다 그게 정확히 뭔지 어떻게 읽어야
프로그램 디버그에 도움이 되는지 알아보도록 하죠
스택 트레이스는 본질적으로 호출 스택의 본질을 나타냅니다 앱이 크래시될 때마다 생성됩니다
치명적인 오류로요
네 스택이라는 용어가 사용되는 이유는 프로그래밍에서 일반적인 데이터 구조를 참조하기 때문이죠
네 네 마지막이 되고 먼저 나가고 이렇게 데이터를 저장합니다
⇲
마지막으로 추가된 데이터 요소는 처음으로 회수하는 거죠
네 팬케이크를 먹을 때 첫 번째 팬케이크를 맨 밑에 넣는 걸 떠올려
보세요
마지막은 맨 위에 있어요
그거 먹으러 가면 마지막에 얹은 거 먹어요
네 스택 트레이스는 프로그램이 중단됐을 때 아주 유용합니다 디버그에 도움이 되는 정보가 들어있기
때문이죠
스택 트레이스는 오류를 유발하는 함수 호출 목록을 보여주죠
프로그램에서 주요 기능을 호출할 때 발생하는 일은 그게 진입점이에요
주요 기능은 다른 기능을 호출하죠
네 네 그런데 이 함수들은
네 여러분이 할 수 있는 건 프로그램이 중단되면 콜 스택이 마지막으로 발동된 함수와
에러를 야기한 특정 코드 줄을 알려줄 거예요
콜택에 좋은 정보가 많아요
네 파일 이름과 예외나 치명적인 에러를 발생시키는 코드 줄 번호를
포함하죠
네 스택 상단에는 오류를 야기한 마지막 호출이 포함돼 있고 중첩된 호출이 있을 수 있어요
스택 하단에는 오류를 호출하기 위한 호출 연쇄를 시작한 첫 번째 호출이 포함돼 있어요
네 C-가 주요 루틴이라면 메인 루틴을 호출하고 다른 기능을 호출하고 또 다른 기능을
호출하고 계속 이어지겠죠
마지막 대사는 세부적이에요
앱이 충돌할 때 아주 유용해요
네 C 프로그램이 붕괴하면 세분화 오류가 발생할 수 있는데 그건 많은 정보를 주지
않아요
뭔가 안 좋은 일이 생겼다는 뜻이죠
코어 파일도 생성할 거예요
네 콜 스택이 포함된 핵심 파일을 분석하면 크래시 문제를 일으킨
정확한 코드 줄을 알 수 있죠
앱에서 충돌을 일으키는 호출을 찾아야 해요
콜 스택이 아마 가장 좋은 방법일 거예요
항상 코어 파일을 볼 필요는 없어요
GDB에서 디버거를 이용해 콜 스택을 분석할 수도 있어요
이게 어떤 모습인지 보여드릴게요
프로그래머는 스택 트레이스도 언제든 버릴 수 있어요
네 오류를 발견하거나 치명적인 오류가 발생할 수 있다는 걸 인식하면 호출 스택을
버리고 상황을 볼 수 있어요
네 오류가 발생하는 시점을 정확히 알 수 없어도 호출
스택을 버려 특정 호출로 이어진 현재 흔적을 볼 수 있죠
GDB를 사용하면 콜 스택은 이렇게 보일 거예요
네 GDB에서 디버거를 실행할 때 메뉴를 통해 콜 스택에 접근할 수 있습니다
어떻게 하는지 보여드릴게요 이렇게 생겼습니다 여기서 보시는 건 숫자와 주소
그리고 함수입니다
네 이 호출 스택은 다양한 호출을 많이 갖고 있어요 다양한 중첩과 다양한 기능
호출을 많이 했을 겁니다
하지만 라인 22 맨 아래에 GTK 메인이라고 돼 있죠
그게 무슨 뜻이냐면요
주요 기능을 실행했을 거란 뜻이죠
21번 라인은 제대로 된 것 같고요
메인 루프 실행이라고 문장이 나올 수도 있죠
G 메인 컨텍스트 이행이라는 함수처럼 보이네요
그 기능 안에는 그 기능 안에는 IAG 주요 컨텍스트 디스패치 함수에 대한 호출이
있을 때마다 있어요
네 반복 함수가 있어요 디스패치 함수와 18번째 줄의 물음표는 디버깅
정보가 없다는 걸 의미하죠
무슨 일이 있었는지 몰라요
네 그래서 프로그램을 빌드할 때 릴리스를 위해 빌드하거나 디버깅 정보를
갖고 빌드할 수 있죠
디버깅 정보와 함께 빌드하면 컴파일 할 때 추가적인 정보를 포함하고 있습니다
그래서 실행할 때 콜 스택을 볼 수 있죠
방출할 때는 뭔가를 만들어야 해요
실행 파일은 훨씬 작고 이 정보를 갖고 있지 않을 수도 있어요
물음표가 더 들어있을 수도 있어요
네 하지만 이건 어떤 라이브러리를 호출했는지도 알려줍니다 어떤 추가 프로그램도요 그걸 호출해 거기서
콜 스택을 알려주는 거죠
네 다시 한 번 보여드리는 건 다양한 중첩된 이벤트예요 제일 위의 호출이
중요하죠 추락의 원인을 나타내니까요
이 콜 스택에서 내부 새로 고침이 문제를 일으킨 것 같네요
22번째 줄부터 0번째 줄까지 볼 수 있어요 코드의 호출마다 다양한 종류가
있죠
하지만 라인제로 콜 스택스에서 프로그램이 고장 났어요
네 프로그램이 실행되는 동안 콜 스택을 볼 수도 있어요 정보를 보기 위해서요 그럼 다시 추적할
수 있죠
함수 안에 브레이크 포인트를 넣으면 디버그를 하고 디버거를 실행하죠
디버거는 중단점에서 멈출 거예요
그런 다음 콜 스택을 불러와 그 줄에 어떻게 접근했는지 말해줄 거예요
이 함수는 이 함수 전에 호출됐어요
역시나 보통 주요 기능에서 시작해요
네 다른 프레임으로 바꿀 수도 있어요 스택이나 콘셉트 메모리 상에 익숙하다면
다른 프레임을 볼 수 있어요 ⇲ C#에서 주로 발생하는 문제를 찾는 데 아주 유용한
도구죠 읽기도 쉽고요
네 네 맨 위를 보면 콜 스택에 대해 잘 모르시겠지만
맨 위를 보면 아 소스구나 크래시를 야기한 코드 줄이네 할 수 있죠
웹에서 찾은 좋은 예가 있어요
외과요
에두요
함수와 스택 예제를 설명하죠
코드 예제를 보면∙∙∙ 간단한 코드를 볼 수 있죠
계산은 중요하지 않아요
기본적으로 함수들을 호출하는 거죠
네 mogrify 함수가 있고 정말 절반 함수예요 주된 함수가 이걸 호출할 겁니다
그럼 정말 절반을 호출해 mogrify할 거예요 호출 스택과 이런
호출에서 어떤 모습인지 설명하는 겁니다 기본적으로 메인에 간단한 중단점을 설정하고
호출을 진행하면서 호출 스택을 살펴보면 됩니다
다시 한 번 중단점과 그런 정보에 좀 더 익숙해질 거예요
네 호출 스택을 잠깐 보여드릴게요 나중에 호출 스택에 대한 보다 상세한 예제를
보여드릴게요
여기에 중단점을 설정했어요
네 빌드하고 컴파일할 수 있어요 디버거를 시작해 중단점을 누를 수 있죠 ⇲
보시다시피 모든 디버거 메뉴가 오른쪽 아래쪽에 있어요 호출
스택도 보이죠
조금 더 크게 만들게요
하지만 14번째 줄에서 멈추면 여기 할당문이 있어요 콜 스택이
메인만 보여주죠
네 그걸 넘어 다음 줄로 가보면 Mogrify를 호출하기 전에 15번째
줄로 가는 걸 볼 수 있죠 네
콜 스택은 메인에서 머물러요
이제 콜 스택이 Mogrify를 보여주는 게 보이시죠
이 함수 안에 있는 거죠
그냥 넘어가죠
첫 번째 줄을 실행하고 임시직을 반환할 거예요
네 여전히 그 함수 안에 있고 16번째 줄에 F를 프린트하는 곳을 반환하죠 콜 스택이 어떻게
변하는지 보세요
그런 다음 라인 18에서 메인 스택 스틸을 호출해 반쪽 기능을 실행하죠
스택 변경 호출 스택 변경 보이시죠 상단의 함수 절반은 항상 마지막에
호출된 함수예요
여기서도 보면 여전히 반쪽짜리예요
메인 서점으로 돌아가서 19번 라인과 21번 라인에 프린트하죠
네 다시 수정 함수로 갑니다 호출 스택에서 볼 수 있죠 건너뛰고 건너뛰고 최종 결과 23번째
줄을 프린트하고 프로그램에서 반환합니다
네 하지만 호출 스택은 한 함수에서 다음 함수까지 실행되는 함수 순서를 보여주죠
중첩된 함수를 사용한다면 더 복잡해질 수 있어요
네 네 콜 스택의 장점은 4번째 줄에서 중단된 코드가 있다면 예를 들어 그 코드가
중단된 곳의 맨 위에 콜 스택이 있다는 거죠
네 그래서 여러분은 호출 스택을 통해 어떤 코드가 마지막으로 호출됐는지
알 수 있어요 어떤 코드가 중단됐는지 알 수 있죠
프로그램이 중단됐을 때 이 도구를 사용하세요
고마워요