디버그 툴

본 장에서는 ofasm 에서 제공하는 디버그 툴에 대해서 설명한다.

1. ofadbg

ofadbg는 Openframe Assembler로 실행된 코드를 추적하고 정보를 출력하기 위한 도구이다.

다음은 ofadbg의 사용 방법이다.

ofadbg <포트번호>

ofadbg 디버깅은 ofasm 디버그 바이너리에서만 사용가능하다.

  • 코드 수정

    디버그를 하고자하는 시점에 OFADBGREG 220 명령어를 삽입해야 한다. 해당 명령어가 수행되면 디버깅을 위한 소켓 서버가 생성되고 소켓 연결을 위한 대기 상태가 된다.

    TESTASM  CSECT
             LR 12,15
             USING TESTASM,12
             ST    14,SAVEAREA
             OFADBGREG 220
             L     2,0(1)
             L     3,4(1)
             MVC   P1(4),0(2)
             MVC   P2(4),0(3)
             CALL  TESTCOB,(P1,P2),VL
             L     14,SAVEAREA
             BR    14
    *
    SAVEAREA DS    F
    P1       DS    CL4
    P2       DS    CL4
             END

    OFADBGREG 220 명령어가 실행되면 아래와 같은 메시지가 출력된다. 메시지에 따라 명령어를 실행한다.

    OFASM: OFADBGREG[220], CONNECT DEBUGGER
    Please run this command "ofadbg 41353", Port is "41353"
  • 컴파일

    ofadbg 를 이용하기 위해서는 ofasm -g를 이용하여 디버그 정보가 있는 asmo 목적코드로 실행되어야 한다.

    ofasm TESTASM.asm -g
  • 툴 실행

    ofadbg 툴을 이용하여 디버깅을 실행한다. 이떄 대기 상태인 소켓 서버에 연결을 시도하고 연결되면 현재 실행중인 asmi 파일의 코드가 출력된다.

    ofadbg 41353
  • 실행 화면

    ofadbg 툴이 정상적으로 실행되면 아래와 같은 console 화면이 출력된다.

    ofadbg console
    ofadbg 실행 화면

1.1. 커맨드

ofadbg에서는 코드 추적과 정보를 출력을 위한 여라가지 커맨드를 지원한다. 자세한 설명은 다음과 같다.

커맨드 설명

break(b) [<entry>:]<line_number>

breakpoint를 설정한다. breakpoint 설정 시 entry를 지정할 수 있고 지정하지 않는 경우 현재 실행되고 있는 entry에 지정된다. 이후 continue(c), run(r) 커맨드로 설정한 breakpoint로 이동한다.

  • b 10 : 현재 entry에 10번째 라인에 breakpoint를 설정한다.

  • b TESTASM:10 : TESTASM entry의 10번째 라인에 breakpoint를 설정한다.

break(b) list

현재까지 설정한 breakpoint 리스트를 출력한다.

  • b list : 현재까지 설정한 breakpoint 리스트를 출력한다.

delete(d)

breakpoint 인덱스를 지정하여 해당 breakpoint를 삭제한다.

  • d 2 : 두 번째 breakpoint를 삭제한다.

display(dis) <symbol>|<address> [[offset:][length]]

특정 심볼 또는 주소를 값 추적 항목으로 등록한다. 심볼을 지정한 경우에만 offset이 유효하며, length를 지정하지 않으면 심볼일 경우에는 할당된 크기, 주소일 경우에는 4바이트로 결정된다.

  • dis P1 2:8 : P1 심볼의 두 번째부터 8바이트 만큼 값 추적 항목으로 등록한다.

  • dis P1 : P1 심볼을 값 추적 항목으로 등록한다 길이는 P1이 할당된 사이즈로 정해진다.

  • dis 0x1f3240 8 : 0x1f3240 주소의 값을 추적 항목으로 등록한다. 길이는 8바이트로 정해진다.

  • dis 0x1f3240 : 0x1f3240 주소의 값을 추적 항목으로 등록한다. 길이는 4바이트로 정해진다.

display(dis) list

현재까지 등록한 심볼에 대한 값 추적 항목을 출력한다.

  • dis list : 현재까지 등록한 심볼에 대한 값추적 항목을 출력한다.

display(dis) remove(rm) <index>

값 추적 항목으로 등록된 특정 인덱스에 해당하는 항목을 삭제한다.

  • dis rm 1 : 첫 번째 항목을 값 추적 항목에서 삭제한다.

set register(reg) <register_num> <hex>|<decimal>

특정 레지스터에 값을 지정한다. 값으로는 정수값 혹은 16진수값을 지정할 수 있다.

  • set reg 2 0x41414141 : 2번 레지스터에 0x41414141 16진수값을 지정한다.

  • set reg 2 10000 : 2번 레지스터에 10000 값을 지정한다.

set variable(var) <symbol_name> <hex>|<string>

특정 심볼에 값을 지정한다. 값으로는 문자열 혹은 16진수값을 지정할 수 있다.

  • set var P1 AAAA : P1 심볼에 "AAAA" 문자열 값을 지정한다.

  • set var P1 0x41414141 : P1 심볼에 0x41414141 16진수값을 지정한다.

set address(addr) <address> <hex>|<decimal>

특정 주소에 값을 지정한다. 값으로는 정수값 혹은 16진수값을 지정할 수 있다.

  • set addr 12543 0x41414141 : 12543 값에 해당하는 주소에 0x41414141 16진수값을 지정한다.

  • set addr 0x1f654 10000 : 0x1f654 번째 주소에 10000 값을 지정한다.

print(p) <symbol> [[offset:][length]]

특정 심볼에 대한 값을 출력한다. offset과 length를 지정할 수 있다. 생략 시 심볼의 크기로 length가 지정된다.

  • p P1 : P1 심볼의 값을 출력한다. 길이는 P1이 할당된 사이즈로 정해진다.

  • p P1 2:8 : P1 심볼의 두 번째부터 8 바이트 만큼 값을 출력한다.

print(p) <address> [length]

특정 주소 대한 값을 출력한다. 길이를 지정하지 않을 경우 길이는 4바이트로 결정된다. 주소값으로는 정수값 혹은 16진수값이 가능하다.

  • p 12453 4 : 12453 번째 주소의 값을 4바이트 만큼 출력한다.

  • p 0x1f324 4 : 0x1f324 번째 주소의 값을 4바이트 만큼 출력한다.

print(p) <d(x,b)> [length]

지정한 레지스터 포맷으로 결정된 주소에 대한 값을 출력한다. 길이를 지정하지 않을 경우 길이는 4바이트로 결정된다.

  • p 10(4,12) 8 : 10(4,12) 번째 주소의 값을 8바이트 만큼 출력한다.

  • p 10(4,12) : 10(4,12) 번째 주소의 값을 기본 값인 4바이트 만큼 출력한다.

set listsize <value>

콘솔모드에서 출력되는 코드의 라인 수를 결정한다. 해당 커맨드는 콘솔모드에서만 유효하다.

  • set listsize 30 : 콘솔모드에서 보여지는 코드의 라인을 30으로 제한한다.

tui

콘솔모드에서 TUI(Text user interface) 모드로 전환한다.

1.2. TUI (Text user interface) 모드

ofadbg 에서 제공하는 User interface 화면으로 전환한다. 콘솔모드의 커맨드창에 tui를 입력하면 활성화된다.

  • SOURCE CODE : 추적 중인 코드를 출력하고 실행 중인 ASM Program을 순서대로 출력한다.

  • REGISTER INFO : R0 부터 R15 까지 레지스터의 현재 값을 출력한다. Condition code (CC) 와 Program counter (PC) 값을 출력한다.

  • SYMBOL LIST : 추적 항목에 등록되어 있는 심볼들의 값을 출력한다.

  • MEMORY LIST : 추적 항목에 등록되어 있는 주소들의 값을 출력한다.

  • CONSOLE : 디버그 툴의 상태와 메시지를 출력하고 커맨드를 입력할 수 있는 입력창을 제공한다.

ofadbg tui
ofadbg tui 모드