UndoDB Startup Guide

TRACE32
이동: 둘러보기, 검색

Getting Started with UndoDB

UndoDB는 reversible debugger로 내부 상태의 분석, 실행된 프로그램의 forward/backward를 사용할 수 있다. 이를 이용하면 bug point까지 모든 program(application)을 확인할 수 있으며, bug의 원인을 찾는데 유용하다.

 

Launching a program in UndoDB

 아래 명령어를 통해 UndoDB에서 program을 실행할 수 있다.

 

 --args parameter를 명시함으로써 command line에서 직접 실행할 수 있다.

 

 

Attaching to an existing process

 Application 실행이 쉽지 않은 경우, attach를 통해서 디버깅이 가능하다.

 

 UndoDB가 debug symbol을 찾게 하기 위해서는 <path-to-exe>를 명시해 주는 것이 중요하다.

 

 

Breakpoints

 Breakpoints는 program이 특정 위치에 도달할 때 사용된다.

 

Setting and hitting a breakpoint

 Break <location> 명령어를 통해 주어진 위치에 멈추도록 UndoDB에 요청할 수 있으며, location은 다음 중의 하나일 수 있다.

 

ü  A function (e.g. break your_function_name)

ü  A file and line number (e.g. break your_file.c:12)

ü  A line number in current source file (e.g. break 12)

ü  A program counter value (e.g. break *0x422fd0)

ü  The next instruction – No argument required for this case (i.e. break)

 

 일단 breakpoint가 설정되면, UndoDB는 program을 멈출 것이고, breakpoint에 의해 명시된 위치에 도달할 것이다. 아래 예를 통해 확인할 수 있다.

 

 

 이 경우, run 명령어는 program을 다시 실행하는 것이고, main function에 도달할 때까지 program은 실행할 것이다. 이 point에서 state 분석을 위한 command를 실행할 수 있다.

 

 

 현재 상태에서 다른 breakpoint 혹은 다른 특정 point로 이동하기 위해서는 continue와 reverse-continue를 사용할 수 있다.

 

 

 이 경우, continue 명령어는 program을 멈추지 않고, 종료될 때까지 실행한다.

 reverse-continue는 program을 backward로 실행하고, 다시 breakpoint를 만날 때까지 backward 실행을 진행한다.

 

Managing breakpoints

 설정된 breakpoint 정보를 확인하기 위해서는 info breakpoints 명령어를 이용한다.

 

 

 delete 명령어를 이용해서 breakpoint를 선택적으로 삭제할 수 있다.

 

 

 만약 main 함수의 breakpoint를 삭제했다면, reverse-continue 명령어는 recorded history의 시작점으로 이동한다.

 모든 breakpoint를 삭제하고 싶다면 어떠한 인자 없이 delete 명령어만 실행하면 된다.

 

 

 

Saving and loading recordings

 적합한 license가 있다면, UndoDB는 program이 수행된 recording 정보를 saving과 loading을 지원한다. Live Recorder에 의해 확보된 recording data도 로딩할 수 있다.

 

Saving a recording

 undodb-save 명령어를 이용해서 UndoDB로부터 recording data를 저장할 수 있다. 현재 수행된 program 정보를 recording file로 저장할 수 있다.

 

 

 

Loading a recording

 undodb-load 명령어를 이용해서 UndoDB로부터 확보한 recording data를 로드할 수 있다. Recording file로부터 program 실행 history를 로드한 후 replay할 수 있다.

 

 

 --undodb-load 옵션을 이용해서 UndoDB 실행 시 recording file을 로드할 수 있다.

 

 

 

Deferred Recording

 기본적으로 UndoDB는 program이 실행되면 즉시 recording을 시작한다. Recording은 reversible debugging을 위해 필요하므로, 정상적인 행동이다.

 하지만 recording을 비결정성 event를 tracking/capturing 때문에 runtime overhead를 발생시킬 수 있다. 그래서 deferred recording은 recording을 disable로 program을 실행할 수 있고, 사용자가 선택한 point에서 enable할 수 있도록 제공한다.

 

When to use

 대부분의 경우에, 사용자들은 recording이 enable된 상태를 가지고 program이 start되는 UndoDB의 default 상황이 권장된다. 이 경우 사용자들은 debugee(UndoDB)가 실행되는 동안에 어떤 디버깅 포인트에 backward로 이동할 수 있는 것을 보장받는다.

 초기 시점의 코드를 잘 알고 있다면 Deferred recording를 사용하는 것은 좋은 선택이다. 그러므로 recording enable 전에 초기 시점을 skip하기 위해서는 유용하다.

 

How to use

Starting UndoDB with recording disabled

 UndoDB는 recording을 disabled한 상태로 UndoDB를 시작할 수 있는 option --undodb-defer-recording을 가진다.

 이 option의 효과는 모든 reverse command가 disabled되기 때문에 기능 자체가 normal GDB session과 매우 유사하다

 

Enabled recording

 일단 사용자가 program 실행에서 잘 알려진 초기 시점을 skip했다면, undodb-enable-record command를 이용해 recording을 enable 할 수 있다. 예를 들면 아래와 같다.

 

 

 

Bookmarks

Bookmarks는 program 실행 중 특정 위치를 표시할 수 있는 편리한 기능이다.

 

Named Bookmarks

 Bookmarks는 undodb-set-bookmark command로 설정할 수 있다. 예를 들면 아래와 같다.

 

 

Bookmark test는 program실행에서 해당 위치를 참조한다; 우리는 undodb-goto-bookmark command 사용으로 언제든지 해당 위치로 이동할 수 있다.

 

 

Auto Bookmarks

 Bookmark 셋팅을 하지 않고 동작 수행을 한 뒤, 다시 이전 위치로 돌아가고 싶은 경우가 있다. 이런 경우 debuggee가 멈출 때마다 자동적으로 만들어 주는 Auto Bookmarks를 통해 해결할 수 있다.

 아래에 예가 있다.

 

 

 만약 이 경우 continue 전에 해당 위치로 돌아가기를 원한다면, 우리는 undodb-goto-bookmark 를 다시 사용하면 된다.

 

 

Relative bookmark access

 UndoDB는 현재 bookmark와 관계된 고유한 ID를 명시함으로써 이전/다음 bookmarks 이동을 지원한다.

 예를 들어, 이전 bookmark로 이동하기 위해서, $-1을 사용한다. 이전 bookmark보다 더 이전의 bookmark로 이동하려면, $-2를 사용한다.

 비슷한 방식으로, $+1은 다음 bookmark로 접근하고, $+2는 다음 bookmark 이후의 bookmark로 이동할 때 사용된다.

 

 

Inferior Calls

 Inferior calls는 보통 사용자가 내부 상태를 관찰하기 위한 목적으로 debuggee 내에서 code를 동작시키기 위한 방법이다.

 이 calls는 call과 print와 같은 명령어를 수행함으로 표현될 수 있다.

 예를 들어, debuggee가 return_buffer() 함수를 가진다면, 아래와 같이 호출될 수 있다.

 

 

 Print는 완벽히 GDB와 동일하게 지원되기 때문에 다음과 같은 동작을 수행할 수 있다.

 

 

Side Effects

 Replay에서 inferior call을 지원하거나 loaded recording을 위해 inferior call을 지원하기 위해서, UndoDB는 debuggee process로부터 Fork()된 임시 프로세스에서 모든 inferior call을 수행한다.

 이것은 Inferior call이 완료된 후에 메모리에 write하는 것과 같은 모든 side effects가 사실상 되돌아가고, debuggee의 record된 history 내에 write되지 않는다. (그러므로 saved recording에 나타나지 않는다)

 

 만약 어떠한 point를 가지지 않는 debuggee가 file descriptor를 close한다면, 단지 정의된 외부상태변화가 stdout과 stderr로 쓰여진다.

 

Note

UndoDB는 현재 stderr과 stdout이 TTYs가 아니라면 replay모드에서 inferior call을 위해 close되는 issue(T4695)를 가지고 있다. 이것은 해당되는 경우에 stderr과 stdout에 write하는 것이 fail되는 것을 의미한다. 만약 UndoDB 사용 중 이런 현상이 있다면 Undo Support에 연락해라

 

 

Remote Debugging

 Remote debugging은 다른 machine에서 program이 동작되는 경우에 사용된다; 이런 경우에는 전형적으로 development machine에서 debugger를 동작하고 debuggee를 test machine에서 동작시키고 제어하는 것이 편리하다.

 

Installing undodb-server on the target

 Undodb-server는 debuggee를 제어하고, record와 rewind를 활성화시킬 수 있는 UndoDB의 한 구성요소이다. GDB를 통한 remote debugging에 익숙하다면, gdbserver와 유사하다. 사용에 있어서 Target machine에 설치되어야 한다.

 설치는 간단한데 undodb-<version>을 target machine의 directory에 복사하거나, NFS와 같은 file-sharing을 통해 활성화시킬 수 있다. Target의 storage 공간이 제한된다면, 단지 요구되는 파일은 target에 맞는 undodb-server(아래를 참고)와 key 파일이다.

 Target device에 날짜와 시간이 정확히 셋팅되는 것이 중요한데, 만약 그렇지 않으면, undodb-server 실행이 되지 않는다.

 

Choosing the appropriate undodb-server executable

 UndoDB and/or Live Recorder를 다운로드하면 undodb-server 실행 파일을 포함한다. Application을 위해 정확히 선택해야 한다.

 정확한 undodb-server 실행 파일은 debuggee application이 컴파일된 architecture에 기반한다.

 

 

Basic case

 Start the server

 

Note

debug되는 program의 path는 상대경로가 아닌 절대 경로로 명시해야 한다.

예를들어, ../my_program은 동작하지 않고, /home/myuser/myprogram은 동작한다.

 

 Connect to the server in UndoDB:

 

 

Autostart debuggee

server를 호출할 때 Debuggee를 즉시 실행하기 위해 --autostart argument를 사용할 수 있다.

 

 

 그러므로 debugger prompt에서 run 명령을 할 필요 없다.

 

 

Attach to debuggee

Debuggee가 이미 실행되고 있다면, server에 pid 정보를 통해 attach방식으로 연결할 수 있다.

 

 

 debugger에서는 run 명령을 수행할 필요는 없다.

 

 

Cross-architecture debugging

 현재 Remote debugging은 ARM board에서 실행하고 있는 program을 연결하는 frontend debugger로 동작하는 x86 development machine 이다. 단지 차이점은 architecture를 UndoDB로 구분할 필요가 있다.