programing

gcc - g : 어떻게 되는가

prostudy 2022. 8. 24. 23:38
반응형

gcc - g : 어떻게 되는가

이 질문은 면접에서 저에게 물어본 것입니다.

디버깅할 수 있는 코어 덤프 파일을 생성하는 방법을 물어봤어요그리고 나서 나는 그렇게 말했다-g깃발을 올리다gcc우린 할 수 있어

그리고 그들은 나에게 그것이 정확히 무엇이냐고 물었다.-gdo를 컴파일러에 플래그를 붙입니다.

디버깅에 사용할 수 있는 코어 파일의 모든 심볼을 열어준다고 했습니다.

그게 정확히 어떤 역할을 하는지 말해줄 수 있나요?

맞아, 하지만 불완전해 -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 。TTEXT: 기타 코드와 읽기 됨), TEXT'는 'TEXT', 'EXT', 'EXT', 'EXT', 'EXT', 'EXT', '는 '0'입니다).
  • g_my_numB메모리를 가진 인 ,
  • NS::ns_my_numD 으로 값을 때문에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

반응형