나는 스택 사용을 소개하는 온라인 코스를 몇 편이나 택했다. 따라서, 나는 간단한 C 프로그램의 스택을 보여줌으로써 그것을 이해하려고 노력 해왔다. 나는 그것을하는 몇 가지 방법을 발견하고 gdb (backtrace ...)를 사용하여 시도했다.C의 스택 내용을 어떻게 표시 할 수 있습니까?
그러나 버그가 발생할 경우 스택 정보 만 표시 할 수 있습니다. 프로그램이 제대로 실행 되더라도 스택을 표시하는 방법이 있는지 궁금합니다.
나는 스택 사용을 소개하는 온라인 코스를 몇 편이나 택했다. 따라서, 나는 간단한 C 프로그램의 스택을 보여줌으로써 그것을 이해하려고 노력 해왔다. 나는 그것을하는 몇 가지 방법을 발견하고 gdb (backtrace ...)를 사용하여 시도했다.C의 스택 내용을 어떻게 표시 할 수 있습니까?
그러나 버그가 발생할 경우 스택 정보 만 표시 할 수 있습니다. 프로그램이 제대로 실행 되더라도 스택을 표시하는 방법이 있는지 궁금합니다.
이론적으로, 당신은 어떤 스택이 있음을 확신 할 수 없다.
예를 들어, 컴파일러는 모든 함수 호출 inline 수 있습니다. 또는 전체 프로그램 static analysis을 수행하고 스택이 필요 없음을 알 수 있습니다. 또는 컴파일러는 optimize 일부 호출을 tail calls으로 처리했습니다.
더 현실적으로 일부 함수 내의 로컬 변수는 모두 (최적화 할 때) 레지스터에 모두 들어갈 수 있습니다.
실제로, 당신은 디버거에서 프로그램을 실행할 수 있습니다 (같은 gdb
) 및 정지 (당신의 gdb
세션에서 Ctrl 키 C와 예) 프로그램은 다음 gdb
의 backtrace
(또는 bt
) 명령을 실행하고 디버그 된 프로세스 중 examine the stack.
(아래 정보는 고급이다, 당신은 초보자 경우 혼동하지 마십시오과 프로그램 내부에서 또는 디버거에서, 컴파일시에 행할 일에 대해 매우 조심)
당신이 사용할 수 있습니다 (GNU libc에 포함) 리눅스의 프로그램 내부의 call stack프로그램에 액세스하려는 경우 backtrace functions (그들은 표준이 아니며, 강력한 최적화를 특히 작동하지 않을 수 있습니다). 또는 심지어 Ian Taylor libbacktrace (libbacktrace
은 DWARF 형식의 디버그 정보를 사용하므로 코드를 모두 -g
으로 컴파일하는 것이 좋습니다).
.
이것은 일반적으로 (런타임에 프로그램 내부에서) 불가능합니다. 변수와 매개 변수는 컴파일러에만 알려져 있습니다 (런타임에는 잊어 버립니다).기계어 코드에는 메모리 위치와 레지스터 만 있습니다 ( 스택 프레임, 이는 -fomit-stack-pointer
compile option ....으로 손실 될 수 있습니다). 또한 종종 C 코드를 optimizations으로 컴파일하면 일부 변수는 스택에 저장되지 않을 가능성이 있습니다 (레지스터에서만 사용 가능).
C는 introspection 또는 reflection이 아니며 명시 적 continuations이 아니며 homoiconic 언어가 아닙니다.
이것은 내가 가지고있는 문제를 해결하고 정말 좋은 설명을 해줍니다. 대단히 감사합니다. – Rick
프로그램이 올바르게 실행 되더라도 스택을 표시하는 방법이 있는지 궁금합니다.
예 : 프로그램 실행 중 임의의 지점에서 스택을 검사 할 수 있습니다. 관심있는 명령어에 중단 점을 설정하거나 전체 프로그램을 단일 단계로 실행하면됩니다. 예를 들어
:
(gdb) break main
(gdb) run
... program stops after main prolog
(gdb) where # examine stack
(gdb) stepi # execute one instruction
(gdb) where
(gdb) stepi
... repeat until you reach syscall SYS_exit, or until you are too bored to continue
하지만 디버거를 사용합니다 .... –
@BasileStarynkevitch 그는 상태를 검사하기 위해 디버거를 사용하는 방법을 묻습니다. 충돌 지점). 참고 GDB 태그에 질문. –
'데이터 스택'이 아니라 '호출 스택'에 대해 이야기하고 있습니다. 맞습니까? – Aubin
[C 또는 C++에서 인쇄 호출 스택]의 가능한 복제본 (http://stackoverflow.com/questions/3899870/print-call-stack-in-c-or-c) – Aubin
예 Aubin, 실제로 스택 호출. 정보를 제공해 주셔서 감사 드리며 방금 시도했습니다. 그러나 백 트레이스 (backtrace)는 호출되는 기능 만 보여주는 것 같습니다. 매개 변수, 변수, SP 등의 값과 같은 스택의 세부 정보를 표시하는 방법을 찾고 있습니다. – Rick