Linux에서 Daemon을 돌리다 보면 버그로 인해서 프로그램이 Crash 되는 일이 종종 있습니다.
 당연히 문제가 되는 부분 찾아서 고쳐야 합니다.

 그럴때 대부분 사용하는 방법이 Process가 죽기전에 기록을 Core파일에 남기도록 설정 하는 방법 입니다.
 정상적으로 남겨진 Core파일 경우라면 디버깅 하는게 큰 문제는 없을 테지만
 아래와 같이 콜스택이 깨져 보이는 난감한 상황을 만들어 내기도 합니다.

Loaded symbols for /lib/tls/librt.so.1

Reading symbols from /usr/lib/libggauth2.so.56...done.

Loaded symbols for /usr/lib/libggauth2.so.56

#0  0x02d10100 in ?? ()

(gdb) bt

#0  0x02d10100 in ?? ()

#1  0x01010000 in ?? ()

#2  0x000002d2 in ?? ()



 콜스택이 깨져 보이는 경우는 주로 Stack Buffer Overrun 으로 인한 문제 입니다.
 (다른 문제는 이 글에서 다루지 않습니다.)
 이 경우, 스택에 있던 Return Address가 지워져 있기 때문에 GDB는 콜스택을 표시하지 못합니다.

 하지만 이런 경우라고 해서 너무 낙심할 것은 아닙니다.
 Stack Buffer가 조금 넘친 경우에는 남은 정보를 이용해서 문제를 해결 할 수 있기 때문입니다.

 이때, 실마리를 제공해주는 것은 Register의 ESP 입니다.
 비록 원하던 Return Adress는 지워졌지만 ESP는 값은 정상적인 값을 유지하고 있습니다.
 이제 ESP가 가르키던 메모리 주변을 뒤져서 Return Address와 유사한 값들이 있는지 찾아보면 문제에 대한 힌트를 얻을 수 있습니다.

 일단 Return Address랑 유사한 녀석들은 어떤 녀석이어야 하는지 파악 해야 합니다.
 당연히 Return Address는 실행가능한 Instruction 들이 저장되어 있는 Code Segment를 가르키고 있습니다. GDB에서는 maint info sections .text 명령어를 통해서 Code Segment를 찾아 볼 수 있습니다.

(gdb) maint info sections .text

Exec file:

    `/home/aa/bb.debug.1f25cf3be302bd7308d598c132ac904b', file type elf32-i386.

    0x08051e20->0x0824fc08 at 0x00009e20: .text ALLOC LOAD READONLY CODE HAS_CONTENTS

Core file:

    `/home/aa/core.1214458224.bb.30678', file type elf32-i386.



 이제 Code Segment의 범위도 구했으니 ESP를 기준으로 주변 탐색해서 Return Address와 유사한 녀석들을 찾아 본다면 아마 콜스택과 유사한 모양이 만들어 질 수 있을 겁니다.

 이를 위해서 간단한 User-defined Command를 만들었습니다.

define findsymbols
set $textbegin = $arg0
set $textend = $arg1
set $si = $arg2
set $ei = $arg3
while $si < $ei
set $value = *(int*)$si
if ($textbegin <= $value && $value <= $textend)
printf "[0x%08x] ", $si
info symbol $value
end
set $si = $si + sizeof(void*)
end
end

 가독성이 다소 떨어지긴 하지만 동작은 간단합니다.
 주어진 범위를 탐색하면서 정해진 범위의 값(Code Segment의 범위)이 들어오면..
 해당 값을 info symbol 을 이용해서 출력하는 Command 입니다.



 실제로 사용하면 아래와 같은 결과를 얻을 수 있습니다. (함수 이름은 가명..)

(gdb) findsymbols 0x08051e20 0x0824fc08 $esp-1024 $esp+1024

[..] IoHandler::SendPacket(char const*, unsigned int, bool) + 786 in section .text

[..] IoHandler::UniCast(char const*, unsigned int) + 26 in section .text

[..] Remote::PartyCast(Party*, char const*, unsigned int) + 141 in section .text

[..] Dispatcher::Do(Task*, TaskMsg*) + 795 in section .text

[..] Task::ExtractTaskMsg(TaskMsg*) + 953 in section .text

[..] Task::svc() + 510 in section .text



콜스택(?)을 얻었으니 ESP값과 비교 등을 통해서 어느 지점에서 Crash되었는 지를 파악할 수 있을 것입니다. 아마 있어야 하는 함수 1~2개가 누락되어서 보이는 경우가 대부분 일테고요. 어떤 함수가 버퍼를 넘치게 했는지 찾아내면 됩니다.

좀 더 정확한 원인을 얻어 보기 위해서는 GDB의 x 명령어 등을 이용해서 ESP 주변 메모리를 잘 뒤져보면 답을 찾을 수 있습니다. 하지만 이 정도 까지 얻었다면 소스를 보고 문제의 원인을 먼저 찾고 문제점이 맞는지 검증하는 편이 더 빠를 수 있습니다.

그럼 즐거운 디버깅 되세요 :)


Posted by U_Seung
저도 이번엔 링크 위주의 글을 하나 적어 봅니다.

요즘 Visual Studio 2008을 쓰는데 Javascript 기능이 매우 좋아진 것 같습니다.
다른 Visual Studio가 좋은 IDE임은 누구나 다 인정 하지만, 특히 Javascript 에서는 빛을 발한다는 느낌이 듭니다.

Visual Studio 2008에서는 Intellisense기능과 Syntax Check 기능이 강화되었습니다.
사실 Javascript 처럼 Cloure가 지원되는 언어들은 완벽하게 Intellisense를 지원하는데 한계가 있습니다만 Visual Studio가 나름 잘 지원해주는 것 같네요. Syntax Error Check는 자주 Syntax error가 나진 않지만 Run time error에 들어가기전에 한번 걸러준다는 점에서 매우 소중한 기능이고요.


자세한 내용은 아래에..

Javascript Intellisense in Visual Studio 2008
- VS 2008 JavaScript Intellisense
- JScript IntelliSense in Visual Studio Orcas
- More Javascript Intellisense with Visual Studio 2008 Beta 2


Javascript Intellisense for Silverlight
- Javascript Intellisense in VS 2008 for Silverlight 1.0 
- Silverlight 1.0 full Javascript Intellisense


Javascript Syntax Check
- JScript Syntax Check in Visual Web Developer 2008 Beta2



--

참, Visual Web Developer 2008 Expression Edition은 무료로 다운받아서 사용하실 수 있습니다.

Posted by U_Seung
Fiddler


Fiddler is a HTTP Debugging Proxy which logs all HTTP traffic between your computer and the Internet. Fiddler allows you to inspect all HTTP Traffic, set breakpoints, and "fiddle" with incoming or outgoing data. Fiddler is designed to be much simpler than using NetMon or Achilles, and includes a simple but powerful JScript.NET event-based scripting subsystem.


Fiddler는 컴퓨터 상에서 네트워크를 통해서 주고 받는 HTTP를 모두 캡쳐하여 이를 보여주는 프로그램 입니다.
네트워크상의 Packet들을 캡처해서 보여주는 프로그램은 Fiddler 이외에도 좋은 프로그램이 많지만 Fiddler는 HTTP에 최적화된 프로그램으로 XML트리로 보기, 퍼포먼스 통계 보기등 다른 캡처프로그램에서 보기 힘든 기능도 제공합니다.


만든 프로그램이 제대로된 패킷을 날리는지 다른 프로그램이 어떻게 하는지 알고 싶을 때, 매우 유용 합니다.
자세한 도움말은 introduction to Fiddler on MSDN. 혹은 Performance Tuning with Fiddler를 참조하시면 됩니다.



Script Debugger for Windows NT 4.0 and Later
The Microsoft Script Debugger is a debugging environment that extends any Microsoft ActiveX® Scripting host application—for example, Microsoft Internet Explorer (IE) or Microsoft Internet Information Server (IIS).
웹프로그래밍을 하다보면 특히 Javascript or VBScript 등에서 디버깅을 하기가 매우 까다롭습니다.
무슨 파일의 몇 번째줄에서 죽었는지만 알아도 참 좋을텐데 말입니다. ^^ VS를 만든 회사답게 Script Debugger도 디버깅의 기본기능을 모두 담았습니다. 스크립트를 개발하는 사람이라면 꼭 써야할 필수품이지 싶습니다. (VS있으신 분은 말고용..^^)


Firebug

Firebug integrates with Firefox to put a wealth of development tools at your fingertips while you browse. You can edit, debug, and monitor CSS, HTML, and JavaScript live in any web page.
요즘에 한창 주가가 오르고 있는 프로그램 이지요. Firefox에도 기본적으로 DOM Inspector를 내장하고 있고, 이 프로그램도 매우 훌륭하지만 Firebug는 이 프로그램보다 n배쯤 더 훌륭한 프로그램인 것 같습니다. 특히 Style이 어떻게 Accumulating 되는지 보여주는 기능은 거의 감동에 가까운 기능입니다. (기존의 프로그램은 주로 결과로 보여주었습니다.)

그리고 마지막으로 별로 좋은 프로그램은 아니지만..
발전 가능성이 보이는 Internet Explorer Developer Toolbar Beta 3 도 쓸만합니다.
사실 IE에서는 IE DOM Inspector라는 프로그램이 쓸만한데 공짜라 아니라서 ㅠㅠ 아쉽지요..



'정보 공유터' 카테고리의 다른 글

날씨 RSS 서비스  (2) 2007/01/26
Prototype 1.5.0 출시..  (1) 2007/01/19
WPF: Yahoo (대박) Messenger for Vista  (2) 2007/01/15
유용한 웹 개발/디버깅 지원 도구 몇 가지  (0) 2007/01/14
Microsoft .Net Framework 3.0, WPF: NY News Reader  (0) 2006/09/24
Google Code Jam  (0) 2006/09/01
네이버 타이머  (0) 2006/08/26
Posted by U_Seung