리눅스 데브코스[6주차 - 5]<GDB 실습>

심우열·2023년 5월 16일
0

1. GDB를 이용한 디버깅

  • l : 소스코드 출력
  • finish : 함수 밖으로 나오는 명령어
  • watch : 궁금한 함수를 break point 로 걸고 c를 이용해서 해당 라인까지 간 뒤에, l로 코드를 출력하서 watch point 로 궁금한 변수의 주소값들의 변화를 체크
  • bt : 함수 콜 스택 확인

1. copy(tlpi-dist/fileio/copy)

  • tui 옵션을 사용

2. fork(tlpi-dist/procexec/fork_whos_on_first)

  • cgdb 사용

3. exec(tlpi-dist/procexec/t_execl)

4. pipe(tlpi-dist/pipes/simple_pipe)

2. VSCode를 이용한 디버깅

  • code . : VSCode 디버거 실행
  • .vscode 파일안에 launch.json 파일 생성

lauch.json 작성법

{
    "version": "0.2.0",
    "configurations": [
      {
        "name": "copy",
        "type": "cppdbg",
        "request": "launch",
        "program": "${workspaceFolder}/fileio/copy",
        "args": [
            "${workspaceFolder}/fileio/copy",
            "${workspaceFolder}/copy_new"
        ],
        "stopAtEntry": true,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "externalConsole": false,
        "MIMode": "gdb",
        "setupCommands": [
          {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
          }
        ],
      },
      {
        "name": "t_fork",
        "type": "cppdbg",
        "request": "launch",
        "program": "${workspaceFolder}/procexec/t_fork",
        "args": [
            "10",
        ],
        "stopAtEntry": true,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "externalConsole": false,
        "MIMode": "gdb",
        "setupCommands": [
          {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
          }
        ],
      },
      {
        "name": "fork_whos_on_first",
        "type": "cppdbg",
        "request": "launch",
        "program": "${workspaceFolder}/procexec/fork_whos_on_first",
        "args": [
            "10",
        ],
        "stopAtEntry": true,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "externalConsole": false,
        "MIMode": "gdb",
        "setupCommands": [
          {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
          }
        ],
      },
      {
        "name": "make_zombie",
        "type": "cppdbg",
        "request": "launch",
        "program": "${workspaceFolder}/procexec/make_zombie",
        "args": [
            "abc",
            "def"
        ],
        "stopAtEntry": true,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "externalConsole": false,
        "MIMode": "gdb",
        "setupCommands": [
          {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
          }
        ],
      },
      {
        "name": "multi_SIGCHLD",
        "type": "cppdbg",
        "request": "launch",
        "program": "${workspaceFolder}/procexec/multi_SIGCHLD",
        "args": [
            "1",
            "2",
            "4"
        ],
        "stopAtEntry": true,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "externalConsole": false,
        "MIMode": "gdb",
        "setupCommands": [
          {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
          }
        ],
      },
      {
        "name": "real_timer",
        "type": "cppdbg",
        "request": "launch",
        "program": "${workspaceFolder}/timers/real_timer",
        "args": [
            "1",
            "800000",
            "1",
            "0"
        ],
        "stopAtEntry": true,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "externalConsole": false,
        "MIMode": "gdb",
        "setupCommands": [
          {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
          }
        ],
      },
      {
        "name": "ptmr_sigev_signal",
        "type": "cppdbg",
        "request": "launch",
        "program": "${workspaceFolder}/timers/ptmr_sigev_signal",
        "args": [
            "2:5"
        ],
        "stopAtEntry": true,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "externalConsole": false,
        "MIMode": "gdb",
        "setupCommands": [
          {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
          }
        ],
      },
      {
        "name": "simple_thread",
        "type": "cppdbg",
        "request": "launch",
        "program": "${workspaceFolder}/threads/simple_thread",
        "args": [
        ],
        "stopAtEntry": true,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "externalConsole": false,
        "MIMode": "gdb",
        "setupCommands": [
          {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
          }
        ],
      },
      {
        "name": "detached_attrib",
        "type": "cppdbg",
        "request": "launch",
        "program": "${workspaceFolder}/threads/detached_attrib",
        "args": [
            "2:5"
        ],
        "stopAtEntry": true,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "externalConsole": false,
        "MIMode": "gdb",
        "setupCommands": [
          {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
          }
        ],
      },
      {
        "name": "simple_pipe",
        "type": "cppdbg",
        "request": "launch",
        "program": "${workspaceFolder}/pipes/simple_pipe",
        "args": [
            "input value",
        ],
        "stopAtEntry": true,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "externalConsole": false,
        "MIMode": "gdb",
        "setupCommands": [
          {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
          }
        ],
      }
    ]
}

1. copy

2. fork

3. exec

4. pipe

3. Toy 프로젝트용 launch.json 작성

  • TOY 프로젝트를 vscode를 이용해서 디버깅 실습
  • main 함수에 브레이크 포인트

1. lauch.json 코드

{
    // IntelliSense를 사용하여 가능한 특성에 대해 알아보세요.
    // 기존 특성에 대한 설명을 보려면 가리킵니다.
    // 자세한 내용을 보려면 https://go.microsoft.com/fwlink/?linkid=830387을(를) 방문하세요.
    "version": "0.2.0",
    "configurations": [
        {
            "name": "toy_system",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/toy_system",
            "args": [
            ],
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
              {
                "description": "Enable pretty-printing for gdb",
                "text": "-enable-pretty-printing",
                "ignoreFailures": true
              }
            ],
          }
    ]
}

2. 실행 모습

profile
Dev Ops, "Git, Linux, Docker, Kubernetes, ansible, " .

0개의 댓글