시판되고 있는 대표적인 디버거를 종류별로 분류해 보았다. 대체로, 세상에는 이들의 분류나 또는 이들의 조합이 상용 디버거로 사용되고 있다.
풀 ICE(In Circuit Emulator) 디버거
CPU 자체를 치환하고, CPU의 동작을 흉내내어(에뮬레이션) 프로그램의 동작을 조사할 수 있는 툴이다. ICE 본체와 호스트 사이는 전용 인터페이스나 Ethernet, 최근에는 USB 등을 사용하여 접속한다. 또, CPU의 동작을 흉내낼 뿐만 아니라, 타겟 CPU 보드상의 ROM이나 RAM도 ICE 본체에 내장(에뮬레이션 메모리)하거나 CPU가 명령을 실행한 주소를 유지하고(트레이스 메모리), 그것을 표시하는 기능 등을 실장한 ICE를, CPU 동작의 모든 기능을 서포트할 있는 ICE 라고 하는 의미로 풀 ICE라고 부르는 경우 있다. 그림 8에 ICE의 구성을, 사진 1에 풀 ICE 디버거의 예를 나타낸다.


풀 ICE는 에뮬레이션 메모리 등을 내장하고 있으므로, 타겟 CPU 보드가 완전하게 동작하지 않는 상태에서도 에뮬레이션 메모리상에서 프로그램의 개발을 진행시킬 있다. 즉 타겟 시스템의 CPU와 ROM이나 RAM 등 로컬버스 연결에 문제가 있어도 ICE를 사용하여 로컬버스상의 어느 곳에 문제가 있는지 debug을 진행시킬 수 있다. 물론, 타겟 시스템의 메모리나 I/O를 디버거가 점유해 버리는 일도 없다. 모든 자원을 어플리케이션이 사용할 수 있다.
ROM 모니터형 디버거
디버거는 스텝 실행이나 브레이크 기능 등, 디벅에 필요한 각종 기능을 갖춘 툴을 말한다. 또 하나, 임베디드 개발의 세계에서는 모니터라고 하는 말을 사용하는 경우도 있다. 모니터란, 기본적으로는 말 그대로 값이나 상태를 표시만 하는 기능을 가진 툴이다. 원래, 임베디드 시스템은 특정한 용도로 특화한 시스템이므로 전원을 투입하자마자 처리가 시작된다. 그러나 개발용으로 사용하는 평가 보드라고 불리는 CPU 보드는 그 자체에서는 특별히 명확한 처리 내용이 있는 것은 아니다. 그래서, 이와 같은 평가 보드상의 ROM에는 임베디드 프로그램 개발자가 작성한 프로그램을 호스트로부터 다운로드할 있는 기능만을 기입하여 출시하는 것이 일반적이다. 이 ROM에 기입된 프로그램을 ROM 모니터라고 부른다. ROM 모니터라고 했을 경우에는 프로그램의 다운로드 기능이나, 메모리나 레지스터의 덤프 기능, 그리고 지정한 어드레스부터 프로그램을 실행하는 기능 정도를 갖추고 있는 것이 일반적이다. 스텝 실행이나 브레이크 기능 등, 본격적인 디벅 기능을 갖추지 않는 것을 모니터라고 부른다. 조금 전에 ROM 모니터에 대해 설명했는데, 이 ROM 모니터에 더욱 본격적인 디벅 기능을 실장하여 디버거로서 사용할 수 있도록 한 것이 ROM 모니터형 디버거이다. 그림 9에 ROM 모니터형 디버거의 구성을 나타낸다. 호스트와의 접속에는 간이적인 것으로는 시리얼 인터페이스를 사용하는 것이 일반적이다. 그 때문에, 타겟 시스템상에 시리얼 인터페이스가 필요하다. 시리얼 인터페이스는 디버거가 호스트와 통신하기 위해 사용하므로 어플리케이션이 사용할 수 없다. 또, ROM상에는 호스트로부터의 지시에 따라, 메모리나 레지스터의 내용을 read/write 하는 통신 프로그램을 기입해 두고 타겟 시스템의 CPU에 그것을 실행시킨다.

이와 같이 ROM 모니터형 디버거는 타겟 시스템에 실장된 인터페이스나 메모리의 일부를 디벅 기능을 위해 사용해 버리는 것과, 원래 호스트와의 통신 프로그램을 타겟 시스템상에서 프로그램으로서 실행시키므로 로컬버스에 문제가 있어 ROM를 읽어낼 수 없는 경우는 디버거 자체가 동작하지 않는다. 이것이 ICE와 크게 다른 부분이다. 또, 일반적인 ROM 모니터형 디버거에서는 ROM 영역에 프로그램을 다운로드할 수 없다. 단, ROM으로서 플래시 메모리가 탑재된 시스템에서는 플래시 메모리에의 기입 알고리즘에 대응하면 직접 다운로드할 수도 있다. 또, 비록 플래시 메모리에 다운로드할 수 있었다고 해도 ROM 모니터형 디버거는 ROM 영역에 브레이크 포인트를 설정할 수 없다(일부의 ROM 모니터형 디버거에서는 CPU 내장의 하드웨어 브레이크 기능을 이용하여, 최대 2개소 정도의 브레이크 포인트를 설정할 수 있는 것도 있다). 이와 같이, ROM 영역의 취급에 제한이 있는 경우가 많기 때문에 ROM화를 상정한 프로그램의 디벅에는 사용하기 어려운 면도 있다.
ROM 에뮬레이터형 디버거
ROM 에뮬레이터형 디버거는 기본적으로는 ROM 모니터형 디버거에 가까운 구조로 되어 있지만, ROM 에뮬레이션 기능을 갖고 있으며, ROM상에서 동작시키는 프로그램을 다운로드하여 디벅할 수도 있다. 물론 ROM상에 자유로이 브레이크 포인트를 설정할 수도 있다.


그림 10에 ROM 에뮬레이터형 디버거의 구성을, 사진 2에 ROM 에뮬레이터형 디버거의 예를 나타낸다. ICE에서는 CPU를 뽑아내고 CPU 소켓에 장착했지만, ROM 에뮬레이터형 디버거에서는 ROM를 소켓에서 뽑아내고, ROM 소켓에 디버거를 접속한다. 호스트와의 접속에는 디버거 본체에 준비된 인터페이스를 사용하기 때문에 타겟 시스템의 자원을 사용하는 일은 없다. 또 에뮬레이션 메모리를 내장하고 있는 점도 풀 ICE에 가까운 특징이다. 그러나, 내부 구조는 ROM 모니터형 디버거에 가까운 구조로 되어 있기 때문에 로컬버스에 문제가 있는 타겟 시스템에서는 디버거가 동작하지 않는 경우가 있다.
JTAG 디버거
CPU를 DIP 패키지에서 뽑아낼 수 있었던 시대는 문제가 없었지만, 고밀도 실장 시대에 IC의 패키지가 QFP 패키지로 됨에 따라 CPU를 떼어낼 없게 되었다. 그래서 ICE용으로 근처에 DIP용의 소켓을 준비하고, ICE를 사용하는 경우에는 QFP의 CPU를 비동작 상태로 하여 개발을 하는 일도 있었다. 또, 고가이지만 QFP용의 커넥터도 있으므로, 개발용으로는 그것을 사용하는 일도 있다. 여하튼 CPU를 떼어내고 접속한다고 하는 구성을 채택하는 ICE는 실현되기 어려운 상황이 되고 있다. 이와 같은 상황은 ROM 에뮬레이터형 디버거에도 마찬가지라고 할 수 있다. 이전에는 UV-EPROM이 일반적이었으므로 28핀이나 32핀 DIP 패키지의 ROM 소켓이 반드시 사용되고 있었지만, 최근에는 플래시 메모리로 치환되어 ROM 소켓이 없다. 그리고 현재는 보드상에 구성하던 회로의 대부분을 LSI 내부에 실장하는 SoC(System on Chip)가 채용되게 되었다. CPU나 ROM를 떼어낼 수 없음은 고사하고, LSI 내부에 함께 들어간다고 하는 사태로 되었다. 이와 같은 사태에 대응하기 위해, CPU의 디벅 전용의 신호선을 준비하고, 그것을 밖으로 인출하여 호스트와 통신하게 하는 수법을 생각하게 되었다. 여기서는 자세한 것은 해설하지 않지만, 현재는 JTAG 단자에 CPU 디벅을 위한 기능을 할당하여 JTAG 단자로부터 CPU 상태를 취득하거나 상태를 변경할 수 있게 되었다. JTAG 디버거는 JTAG 단자를 이용하여 CPU를 디벅하는 것이다. 앞에서 언급한 상황으로부터, 최근에 등장된 디버거이다. 그림 11에 JTAG 디버거의 구성을, 사진 3에 JTAG 디버거의 예를 나타낸다. JTAG 단자의 신호는 그대로는 호스트에 접속할 수 없기 때문에 일반적으로는 JTAG 신호를 Ethernet이나 USB 등으로 변환하는 회로가 필요하게 되므로, ICE나 ROM 에뮬레이터형 디버거와 같이, 타겟 시스템의 외부에 박스를 두는 형태로 된다.


일반적으로 JTAG 디버거는 CPU의 동작을 직접 내부에서 제어하므로, ICE와 마찬가지로 로컬버스에 문제가 있는 타겟 시스템에서도 메모리나 I/O를 read/write하여 그 원인을 밝혀낼 수 있다. 그러나, 에뮬레이션용의 메모리는 내장하고 있지 않았기 때문에 프로그램을 다운로드하려면 타겟 시스템상의 메모리가 정상적으로 read/write할 있을 필요가 있다. ROM 영역의 취급은 ROM 모니터형 디버거에 가까운 부분이 있다. 플래시 메모리에 대응하고 있으면 ROM 영역에 다운로드할 수도 있다. ROM 영역에의 브레이크 포인트도 CPU가 내장한 하드웨어 브레이크 기능을 이용하여 실현되고 있는 JTAG 디버거가 많은 듯 하다.
최강 디버거는 에뮬레이션 메모리 & 트레이스 메모리 내장 JTAG 디버거?
ICE와 ROM 에뮬레이터형 디버거, JTAG 디버거는 모두 타겟 시스템의 외부에 변환회로 등을 위한 박스를 두고, 호스트와 접속할 필요가 있다. 그 때문에, 여하튼 비용이 든다. 일반적인 코스트 비교에서는 에뮬레이션 메모리나 CPU 기능을 내장한 ICE가 가장 비싸고, 다음에 에뮬레이션 메모리를 내장한 ROM 에뮬레이터형 디버거로 된다. 이 중에서 비교적 저렴한 것는 JTAG 디버거라고 할 수 있다. ROM 모니터형 디버거는 타겟 시스템상의 자원을 이용하여 호스트와 통신하므로, 디버거로서 필요한 부품에 대한 비용은 들지 않는다. 그러나 디버거로서의 기능은 다른 3종류의 디버거보다 뒤떨어진다. 최근에는 디버거가 좋은 부분을 조합한 디버거로서 ROM 에뮬레이션을 위한 에뮬레이션 메모리나, 트레이스 기능을 위한 트레이스 메모리를 내장한 JTAG 디버거가 등장하고 있다.
|