gcc - g : 어떻게 되는가
이 질문은 면접에서 저에게 물어본 것입니다.
디버깅할 수 있는 코어 덤프 파일을 생성하는 방법을 물어봤어요그리고 나서 나는 그렇게 말했다-g
깃발을 올리다gcc
우린 할 수 있어
그리고 그들은 나에게 그것이 정확히 무엇이냐고 물었다.-g
do를 컴파일러에 플래그를 붙입니다.
디버깅에 사용할 수 있는 코어 파일의 모든 심볼을 열어준다고 했습니다.
그게 정확히 어떤 역할을 하는지 말해줄 수 있나요?
맞아, 하지만 불완전해 -g
컴파일러와 링커가 소스 수준의 디버깅/디버깅 정보를 생성하고 실행 파일에 저장하도록 요구합니다.
만약...
- 프로그램이 나중에 크래시하여 코어 파일을 생성한다(실제 코드에 문제가 있음을 시사한다).
- 의도적인 OS 명령으로 인해 강제로 코어(예:
kill -SIGQUIT
pid) 또는 - 프로그램이 코어를 덤프하는 함수를 호출합니다(예: )
...- 이들 중 어느 것도 실제 사용으로 인한 것은 아닙니다.-g
- 그러면 디버거는 "를 읽는 방법을 알게 됩니다.-g
" 실행 파일의 정보를 심볼로 표시하여 핵심과 상호 참조합니다.즉, 스택 프레임 내의 변수와 함수의 적절한 이름을 표시하고, 행 번호를 취득하고, 실행 파일 내에서 이동하면서 소스를 확인할 수 있습니다.
이 디버깅 정보는 코어에서 시작했는지 실행 파일만 시작했는지 여부에 관계없이 디버깅할 때마다 유용합니다.또, 와 같은 커맨드에서 보다 좋은 출력을 얻을 수도 있습니다.
환경에는 코어의 생성 여부를 제어하는 다른 설정이 있을 수 있습니다(코어는 크기가 클 수 있으며 제거할 수 있는지 또는 제거할 수 있는지 여부를 일반적으로 알 수 없기 때문에 항상 필요한 것은 아닙니다).예를 들어 UNIX/LINUX 쉘에서는 이 됩니다.
또한 DWARF Wikipedia에 대해서도 읽어보실 수 있습니다.DWARF Wikipedia는 UNIX 및 Linux 등의 실행 가능 파일/라이브러리 오브젝트에 내장된 디버깅/심볼 정보를 인코딩하기 위해 일반적으로 사용되는 디버깅 정보 형식입니다.
Victor의 요청에 따라 업데이트(댓글)...
기호 정보에는 소스 코드의 식별자(보통 이름 망글링이 필요한 경우에만 해당), 프로세스 메모리에 로드되는 (가상) 메모리 주소/오프셋의 유형(예: 데이터 대 코드)이 나열됩니다.예를 들면...
$ cat ok.cc
int g_my_num;
namespace NS { int ns_my_num = 2; }
int f() { return g_my_num + NS::ns_my_num; }
int main() { return f(); }
$ g++ -g ok.cc -o ok # compile ok executable with symbol info
$ nm ok # show mangled identifiers
00000000004017c8 d _DYNAMIC
0000000000401960 d _GLOBAL_OFFSET_TABLE_
0000000000400478 R _IO_stdin_used
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
000000000040037c T _Z1fv # this is f()
0000000000401798 D _ZN2NS9ns_my_numE # this is NS::ns_my_num
00000000004017a8 d __CTOR_END__
00000000004017a0 d __CTOR_LIST__
00000000004017b8 d __DTOR_END__
00000000004017b0 d __DTOR_LIST__
0000000000400540 r __FRAME_END__
00000000004017c0 d __JCR_END__
00000000004017c0 d __JCR_LIST__
00000000004017c8 d __TMC_END__
00000000004017c8 d __TMC_LIST__
0000000000401980 A __bss_start
0000000000401788 D __data_start
0000000000400440 t __do_global_ctors_aux
00000000004002e0 t __do_global_dtors_aux
0000000000401790 d __dso_handle
0000000000000000 a __fini_array_end
0000000000000000 a __fini_array_start
w __gmon_start__
0000000000000000 a __init_array_end
0000000000000000 a __init_array_start
00000000004003a0 T __libc_csu_fini
00000000004003b0 T __libc_csu_init
U __libc_start_main
0000000000000000 a __preinit_array_end
0000000000000000 a __preinit_array_start
0000000000401980 A _edata
0000000000401994 A _end
0000000000400494 T _fini
000000000040047c T _init
0000000000400220 T _start
000000000040024c t call_gmon_start
0000000000401980 b completed.6118
0000000000401788 W data_start
0000000000400270 t deregister_tm_clones
0000000000401988 b dtor_idx.6120
0000000000401994 A end
0000000000400350 t frame_dummy
0000000000401990 B g_my_num # our global g_my_num
0000000000400390 T main # the int main() function
00000000004002a0 t register_tm_clones
$ nm ok | c++filt # c++filt "unmangles" identifiers...
00000000004017c8 d _DYNAMIC
0000000000401960 d _GLOBAL_OFFSET_TABLE_
0000000000400478 R _IO_stdin_used
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
000000000040037c T f()
0000000000401798 D NS::ns_my_num
00000000004017a8 d __CTOR_END__
00000000004017a0 d __CTOR_LIST__
00000000004017b8 d __DTOR_END__
00000000004017b0 d __DTOR_LIST__
0000000000400540 r __FRAME_END__
00000000004017c0 d __JCR_END__
00000000004017c0 d __JCR_LIST__
00000000004017c8 d __TMC_END__
00000000004017c8 d __TMC_LIST__
0000000000401980 A __bss_start
0000000000401788 D __data_start
0000000000400440 t __do_global_ctors_aux
00000000004002e0 t __do_global_dtors_aux
0000000000401790 d __dso_handle
0000000000000000 a __fini_array_end
0000000000000000 a __fini_array_start
w __gmon_start__
0000000000000000 a __init_array_end
0000000000000000 a __init_array_start
00000000004003a0 T __libc_csu_fini
00000000004003b0 T __libc_csu_init
U __libc_start_main
0000000000000000 a __preinit_array_end
0000000000000000 a __preinit_array_start
0000000000401980 A _edata
0000000000401994 A _end
0000000000400494 T _fini
000000000040047c T _init
0000000000400220 T _start
000000000040024c t call_gmon_start
0000000000401980 b completed.6118
0000000000401788 W data_start
0000000000400270 t deregister_tm_clones
0000000000401988 b dtor_idx.6120
0000000000401994 A end
0000000000400350 t frame_dummy
0000000000401990 B g_my_num
0000000000400390 T main
00000000004002a0 t register_tm_clones
주의:
- 의 기능
f()
★★★★★★★★★★★★★★★★★」main()
type 。T
TEXT: 기타 코드와 읽기 됨), TEXT'는 'TEXT', 'EXT', 'EXT', 'EXT', 'EXT', 'EXT', '는 '0'입니다). g_my_num
B
메모리를 가진 인 ,NS::ns_my_num
D
으로 값을 때문에2
그 기억을 차지하기 위해서요
man/info 페이지에는 이러한 내용이 추가되어 있습니다.
- g에게 디버깅합니다.gcc - g는 gcc로, gcc 플래그는 디버깅 정보를 생성합니다. ulimit -c
코어 파일 생성을 활성화하기 위해 사용합니다.이것들 중 하나를 빼고 둘 중 하나를 가질 수 있다.
-g 플래그는 컴파일러에 디버깅 정보를 생성하도록 지시합니다.코어 파일 생성 여부에는 영향을 주지 않습니다.대부분의 Unix 계열 시스템에서는 ulimit 명령을 사용하여 설정할 수 있습니다.
g 플래그를 붙이지 않으면는 gdb 내의 콜리스트를 호출하여 소스 코드를 일람표시할 수 없습니다."No symbol table is loaded"라고 표시됩니다."file" 명령을 사용합니다.
또한 info func 또는 info frame, info locals in gdb, -g를 입력하지 않으면 반환 데이터형과 그 인수는 표시되지 않습니다.기본적으로 명령어를 변수(심볼 테이블에서 매핑)로 변환하지 않습니다.
-g
는 디버깅 정보(디버깅 이름, 행 번호 등)를 실행 파일에 추가합니다.이것은 핵심 파일을 이해하기 위해 필요한 작업의 일부입니다.
http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options
세그멘테이션 장애(Segmentation Fault)입니다. gdb source.cc core
코어 파일을 조사하는 방법 중 하나입니다.모든 프레임을 역추적하여 조사하는 것이 핵심을 조사하는 시작입니다. -g
는 바이너리에 디버깅 기호를 추가합니다.
코어 덤프는 이 프로세스가 표준 신호 "SIGQUIT", "SIGILL", "SIGABRT", "SIGFPE", "SIGSEGV" 등의 신호를 수신할 때 프로세스의 기본 액션 중 하나입니다.그러나 대부분의 셸은 코어 파일의 생성을 억제합니다.단, 코어 파일이 큰 경향이 있고 시간이 오래 걸릴 수 있기 때문입니다.
코어 생성을 활성화하기 위해 "ulimit"는 셸 또는 그 자식 프로세스의 파일 제한을 설정하는 데 사용할 수 있는 유틸리티입니다.
컴파일러 플래그 -g 또는 컴파일러에만 관련된 모든 것.논리적으로 말하면 코어 덤프와는 관계가 없습니다.
언급URL : https://stackoverflow.com/questions/5179202/gcc-g-what-will-happen
'programing' 카테고리의 다른 글
지원되지 않거나 구현되지 않은 작업에 대해 Java에서 발생하는 표준 예외는 무엇입니까? (0) | 2022.08.24 |
---|---|
vuejs v-on에서 Chrome이 작동하지 않음:옵션 태그를 클릭합니다. (0) | 2022.08.24 |
Vuejs의 데이터에 계산된 속성 사용 (0) | 2022.08.24 |
Vue 3: 컴포넌트가 반응하지 않는 이유는 무엇입니까? (0) | 2022.08.24 |
Vuex 스토어의 로컬 복사본에서 데이터 업데이트 (0) | 2022.08.24 |