라벨이 Linux인 게시물 표시

[Linux] 문자열을 포함하는 파일 찾기 (Find file including string)

이미지
  평소 파일을 찾기위해 많이 사용하는 명령어 입니다. find . -name "*.*" | xargs grep -ns --color=auto "검색키워드" 사용 쉘 커맨드 : find, xargs, grep ( Windows 에서는  POSIX기반 소프트웨어를 구동을 위해 Cygwin 또는 MinGW 를 사용 합니다. ) find : 파일 및 디렉토리를 검색할 때 사용하는 명령 -name "검색패턴" : 지정된 문자열 패턴에 해당하는 파일 검색 ( *.* : 모든 파일 형식 ) xargs : 파이프로 넘겨받는 앞 명령어의 출력 결과를 xargs 다음 명령어의 인자(Arguments)로 넘겨주는 명령 grep :  입력으로 전달된 파일의 내용에서 특정 문자열을 찾고자할 때 사용하는 명령 -n : 매칭된 라인을 출력할 때 파일 라인 번호를 함께 출력 함. -s : 에러 메시지를 출력하지 않음. --color=auto : 결과를 쉽게 구분할 수 있도록 컬러로 출력 함.  사용 예제) 게임에서 사용 되는  파일 위치와 이름 이 궁금할 경우, 키워드를 사용해서 검색 할 수 있음. 1. 게임이 설치된 폴더로 이동. 2. 검색 키워드 "마틸다" 로 검색. ( find . -name "*.*" | xargs grep -ns --color=auto "마틸다" ) 3. 파일 위치 및 이름과 "마틸다" 문자열이 파일의 몇 번째 라인에 위치하는지 확인. 

[Linux] make - 3

이미지
 이젠 Makefile 을 src 에 두지 않고 아래와 같이 따로 상위 폴더로 분리 해 보자 /* include/my_math.h */ int add ( int x, int y) ; int subtract ( int x, int y) ; int multiply ( int x, int y) ; int divide ( int x, int y) ; ​ /* src/main.c */ # include <stdio.h> # include <pthread.h> # include <my_math.h> void * thread_func ( void *data) { printf ( "[%s]\n" , __func__); printf ( "%d\n" , add( 10 , 5 )); printf ( "%d\n" , subtract( 10 , 5 )); printf ( "%d\n" , multiply( 10 , 5 )); printf ( "%d\n" , divide( 10 , 5 )); return 0 ; } int main ( void ) { pthread_t thread; pthread_create(&thread, 0 , thread_func, 0 ); pthread_join(thread, 0 ); return 0 ; } /* src/add.c */ # include <my_math.h> int add ( int x, int y) { return x + y; } //----------------------------------------------------------------------------------

[Linux] make - 2

이미지
 이전 예제에서는 소스파일과 헤더파일이 동일한 경로에 있었는데, 이번에는 c파일은 src 폴더에, h파일은 include 폴더에 나누어 위치 시키고 컴파일을 해 보자. 전체적인 구조는 다음과 같다. /* include/add.h */ int add ( int x, int y) ; /* src/add.c */ # include <add.h> int add ( int x, int y) { return x + y; } /* main.c */ # include <stdio.h> # include <add.h> int main ( void ) { int value = 0 ; value = add( 3 , 5 ); printf ( "%d\n" , value); return 0 ; } Make 파일은 src 디렉토리에 있고, 헤더파일은 include 디렉토리에 있으므로, -I../include 를 추가 해 주어야 한다. # src/Makefile CC = gcc CFLAGS = -I../ include -c TARGET = result OBJS = main.o add.o $(TARGET) : $(OBJS) $(CC) $(OBJS) -o $(TARGET) %.o: %.c $(CC) $(CFLAGS) $< clean: rm -rf $(OBJS) $(TARGET) 이번엔 스레드를 사용하는 예제를 살펴 보자. /* src/main.c */ # include <stdio.h> # include <pthread.h> void * thread_func ( void *data) { printf ( "%s\n" , __func__); } int main ( void ) {

[Linux] make - 1

  프로그램 빌드 자동화 소프트웨어 여러 파일들 간의 의존성 과  각 파일을 위한 명령어 를 정의 한 Makefile을 해석하여 실행파일 또는 라이브러리를 빌드 함 따로 옵션을 주지 않을 경우 default로 Makefile 또는 makefile 파일을 찾고, 다른 이름의 파일을 넘겨 줄 경우에는 -f 옵션으로 파일 이름을 지정 함. 기본구조 Target: Dependencies [TAB키] Commands TAB키 부분에 SPACE키를 사용하면 안됨. Target - Command 실행 결과로 만들어 지게 되는 목적(object) 파일 Dependencis - Target을 만들 때 의존성(연관관계)를 규정. 이 부분에 나열된 파일이 수정되면 command를 수행해서 target을 다시 만듦. 즉 target 파일의 최종 수정 시간과 dependencies에 있는 파일들의 최종 수정 시간을 비교해서 command 수행여부를 결정 Command - Target을 만들기 위해 실행해야 하는 명령. command는 여러줄이 될 수도 있음. Comment - '#' 뒤에 오는 글자는 주석 처리 함. Command 앞에 '@'을 붙여주면 그 명령은 화면에 출력 되지 않음. # 커맨드 앞에 @를 붙이지 않은 경우 # Makefile all : echo hello #---------------------------------------- $ make echo hello hello # 커맨드 앞에 @를 붙인 경우 # Makefile all: @echo hello #---------------------------------------- $ make hello 예를 들어 다음과 같은 2개의 소스 파일과 1개의 헤더 파일이 있다고 할 때, /* add.h */ int add ( int x, int y) ; // ---------------------------------------------------------

[Linux] GDB (GNU Debugger) 사용하기 - 7

이미지
  스코프 변경하기 다음 코드에서는 Depth 가 2인 함수 호출을 하게 됩니다. main( ) → func1( ) → func2( ) // frame.c # include <stdio.h> void func2 () { int b = 30 ; printf ( "func2\n" ); } void func1 () { int a = 20 ; printf ( "func1\n" ); func2(); } int main () { int n = 100 ; printf ( "Start\n" ); printf ( "[main] n = %d\n" , n); func1(); printf ( "End\n" ); return 0 ; } 각 스코프에서는 접근 가능한 지역 변수를 확인 할 수 있습니다. Break Point를 라인넘버 7에 걸고 run 커맨드로 실행 후, backtrace 커맨드로 스택 프레임을 확인 해보겠습니다. 그러면 왼쪽에 스택 프레임 넘버가 나오게 됩니다. 지금 위치한 프레임은 함수 func2( ) 스코프 이므로, 변수 b 만 확인 할 수 있습니다. 하지만, frame 커맨드 (약자 'f') 를 사용하면 스택프레임번호에 맞는 스코프에 포커싱 하여 상위 호출단의 지역변수에 접근이 가능합니다. (gdb) frame [스택프레임번호] frame 1을 입력하여 스코프를 함수 func1( ) 으로 포커싱 시킬 수 있습니다. 그러면 변수 a에 접근이 가능해 집니다. 포커싱이 func1( )에 되어있기 때문에, b 변수에는 접근 할 수 없게 됩니다. frame 2를 입력하게 되면 main( ) 함수로 포커싱 됩니다. 그러면 변수 n에는 접근 가능하나 func1 과 f

[Linux] GDB (GNU Debugger) 사용하기 - 6

이미지
  코어 덤프 프로그램이 죽었을 때, 코어 덤프를 남겨 봅시다. 쉘에서 다음과 같이 명령어를 입력 해 봅시다. ulimit -a core file size가 0 이므로, 프로그램이 죽어도 코어덤프가 생성 되지 않습니다. 그럼 core file size를 unlimited로 변경 해 봅시다. unlimit -c unlimited 그런다음 이전 포스트에서 사용 했던 코드를 사용하여 프로그램을 실행 하였을 떄 core가 생성 되는지 확인 해 봅니다. // seg_free.c # include <stdio.h> # include <stdlib.h> # include <string.h> char * str; void allocate ( void ) { str = ( char *) malloc ( sizeof ( char ) * 10 ); } void deallocate ( void ) { free (str); free (str); } void assign ( void ) { strcpy (str, "Hello World" ); } int main ( void ) { printf ( "Start\n" ); allocate(); assign(); printf ( "str = %s\n" , str); deallocate(); printf ( "End\n" ); return 0 ; } 프로그램을 실행하면, 죽고나서 core를 남깁니다. gdb에서는 이 core 파일을 가지고 디버깅 할 수도 있습니다. gdb [프로그램] core

[Linux] GDB (GNU Debugger) 사용하기 - 5

이미지
  코드 라인 추적하기 (gdb) backtrace backtrace (약자 'bt') 커맨드를 사용하면 프로그램이 중단 되었을 때 또는 현재 실행 중인 코드 위치를 확인 할 수 있습니다. 고의적으로 문제를 유발하는 코드를 작성 해 봅시다. # include <stdio.h> # include <stdlib.h> # include <string.h> char * str; void allocate ( void ) { str = ( char *) malloc ( sizeof ( char ) * 10 ); } void deallocate ( void ) { free (str); free (str); // -> 에러 발생을 위해 free를 2번 호출 하였습니다. } void assign ( void ) { strcpy (str, "Hello World" ); } int main ( void ) { printf ( "Start\n" ); allocate(); assign(); printf ( "str = %s\n" , str); deallocate(); printf ( "End\n" ); return 0 ; } gdb 로 오픈하고, run 커맨드를 입력하면 프로그램이 뻗게 되는데, 이 상태에서 backtrace 커맨드를 입력 해 봅시다. 어떤 문제로 죽었고, 어디에서 유발시켰는지 알려줍니다.

[Linux] GDB (GNU Debugger) 사용하기 - 4

이미지
  변수에 접근 되는 시점에 브레이크 포인트 걸기 (gdb) watch [변수] 변수 스코프(scope)가 매칭되어야 왓치포인트(Watchpoint)를 설정 할 수 있습니다. 즉, 전역 변수는 아무곳에서나 Watchpoint를 설정할 수 있지만, 지역 변수는 해당 변수의 scope에서만 Watchpoint를 설정 할 수 있습니다. // watch.c # include <stdio.h> int main ( void ) { int i; printf ( "Start\n" ); for (i= 0 ; i< 10 ; i++) { printf ( "i = %d\n" , i); } printf ( "End\n" ); return 0 ; } gdb로 실행 파일을 오픈합니다. 바로 Watch 포인트를 걸 수 없으므로, 우선 라인7에 브레이크 포인트를 걸고 run 커맨드로 실행을 해서, main 함수 스코프로 진입하게 합니다. 그 다음에 'watch i'를 입력하여 i 변수에 Watch 포인트를 겁니다. 브레이크 포인트와 마찬가지로 info break 커맨드를 통해 Watch 포인트도 확인 할 수 있습니다. Continue 커맨드를 입력 할 때마다, 변수 i 의 값이 바뀌는 것을 확인 할 수 있습니다. 특정 조건 만족시 Breakpoint 걸기 (gdb) break [라인넘버] if [조건] 예를 들어, 10번째 라인에 i가 5일 때 브레이크 포인트가 걸리게 하고 싶다면, break 10 if i==5 라고 입력하면 됩니다. break info 커맨드로 확인 하면 다음과 같이 나옵니다.