1-2 개발 Tool 학습

do·2022년 3월 2일
0

API

목록 보기
2/42

calc1.c

  • 계산기 프로그램
#include <stdio.h>
#include <stdbool.h>

int main()
{
	int a, b, result;
	bool bUndefined = false;
	scanf("%d", &a);
	scanf("%d", &b);

	int calc[5] = { 43,45,42,47,37 };
	for (int i = 0; i < sizeof(calc) / sizeof(int); i++) {
		
		if (calc[i] == 43)
			result = a + b;
		else if (calc[i] == 45)
			result = a - b;
		else if (calc[i] == 42)
			result = a * b;
		else if (calc[i] == 47) {
			if (b == 0)
				bUndefined = true;
			else
				result = a / b;
		}
		else if (calc[i] == 37){
			if (b == 0)
				bUndefined = true;
			else
				result = a % b;
		}
			
		if(bUndefined)
			printf("%d %c %d = %s\n", a, calc[i], b, "undefined");
		else 
			printf("%d %c %d = %d\n", a, calc[i], b, result);
	}

	return 0;
}

calc2.c

  • 함수로 나눈 계산기 프로그램
  • 중단점 디버그

add.c

int add(int a, int b) {
	return a + b;
};

sub.c

int sub(int a, int b) {
	return a - b;
}

mul.c

int mul(int a, int b) {
	return a * b;
}

div.c

int div(int a, int b) {
	if (b == 0)
		return -1;
	else
		return a / b;
}

remainderr.c

int remainderr(int a, int b) {
	if (b == 0)
		return -1;
	else
		return a % b;
}

calc2.c

#include <stdio.h>

int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int div(int a, int b);
int remainderr(int a, int b);

int main()
{
	int a, b;
	scanf("%d", &a);
	scanf("%d", &b);

	printf("%d + %d = %d\n", a, b, add(a, b));
	printf("%d - %d = %d\n", a, b, sub(a, b));
	printf("%d * %d = %d\n", a, b, mul(a, b));

	if (div(a, b)==-1)
		printf("%d / %d = %s\n", a, b, "undefined");
	else
		printf("%d / %d = %d\n", a, b, div(a, b));

	if (remainder(a, b)==-1)
		printf("%d %% %d = %s\n", a, b, "undefined");
	else
		printf("%d %% %d = %d\n", a, b, remainder(a, b));

	return 0;
}
  1. calc2 바이너리 컴파일
  2. gdb로 calc2 프로그램 기동: gdb calc2
  3. add() 함수 호출 전에 breakpoint 설정하고 프로그램 실행: b add (gdb) r
  4. add() 함수 안에서 인자로 받은 2개 값의 변수 내용 출력: p variable
  • 에러1 : (gdb) p a => No symbol "a" in current context
  • 에러2 : (gdb) info locals => No symbol table info available.
    에러1&2 수정 : gcc -ggdb -O0 -o calc2 calc2.c add.c sub.c mul.c div.c remainderr.c => 처음에 컴파일 할 때 (Makefile에) 옵션을 넣어준다
    -ggdb : option for adding the debug info
    -O0 : disable all the optimization
    -o : provide a name to the binary other than default(a.out/a.exe)
  • 에러3 : (gdb) b add => No symbol table is loaded. Use the "file" command.
    에러3 수정: (gdb) file calc2 (gdb) b add
  1. add() 함수 종료될 때까지 라인 단위로 수행: n s
  2. 나머지 함수 호출 전에 break설정
  3. 함수 호출 단위로 수행/내부로 들어가지 말고 결과값만 받기: finish
  4. 나머지 계속 수행: c

GDB 명령어 정리 >> https://mintnlatte.tistory.com/581

0개의 댓글