리눅스 상에서 record & replay 를 이용해서 일어나기 힘든 버그를 재현 해낼 수 있는 jockey 의 사용법에 대해서 설명한다.
jockey 는 'BINARY HACKS' 라는 책에서 소개하고 있다.
준비운동 하기
jockey 는 http://home.gna.org/jockey/ 에서 다운 받을 수 있다. 현재 최신 버전은 0.8.1 이며, 각각 source 와 rpm 포맷으로 받을 수 있다.
참고로 여기서는 rpm 포맷으로 설치하기로 한다.
리눅스는 페도라 코어 4 를 설치했다.
설치 하기
jockey 를 설치하기 전에 미리 설치되어 있어야 할 rpm 패키지들이 있다.
- autoconf
- libtool
- boost, boost-devel
- ruby, ruby-lib, ruby-devel
없다면, 설치해주어야 한다. http://download.gna.org/jockey/fc4/ 에서 가장 최신버전(jockey-0.8.1-1.i386.rpm, jockey-debuginfo-0.8.1-1.i386.rpm)을 다운로드 한다.
#rpm -ivh jockey-debuginfo-0.8.1-1.i386.rpm #rpm -ivh jockey-0.8.1-1.i386.rpm // 의존성 오류
설치시에 의존성 오류가 발생하면, '–nodeps' 옵션을 추가한다.
#rpm -ivh --nodeps jockey-0.8.1-1.i386.rpm
에러없이 설치되었다면, /etc/sysctl.conf 파일에 다음을 추가해준다.
kernel.randomize_va_space = 0 vm.legacy_va_layout = 1
그리고 재부팅한다.
사용 하기
record & replay 를 확인하기 위해서 실시간 시간을 출력하는 date 명령어를 이용해보겠다.
#jockey /bin/date Warning: /bin/date is, by default, excluded from tracing. Warning: I'm adding 'excludedprogram=-' option as a courtesy. Tue Oct 30 04:22:34 KST 2007
이제 다시 실행시켜 보겠다.
#jockey --replay=1 /bin/date Warning: /bin/date is, by default, excluded from tracing. Warning: I'm adding 'excludedprogram=-' option as a courtesy. Tue Oct 30 04:22:34 KST 2007
같은 결과가 출력되는 것을 볼 수 있다.
이번에는 소켓을 이용한 프로그램을 record & replay 해보겠다.
#jockey 더블유겟 -qO- 'http://www.random.org/integers/?num=100&min=1&max=100&col=5&base=10&format=html&rnd=new' Warning: /usr/bin/더블유겟 is, by default, excluded from tracing. Warning: I'm adding 'excludedprogram=-' option as a courtesy. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <title>RANDOM.ORG - Integer Generator</title> <link rel="stylesheet" type="text/css" href="/style.css" media="all" /> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <meta name="Keywords" content="true random numbers" /> <meta name="author" content="Mads Haahr" /> <script type="text/javascript" src="/random.js"></script> </head> <body> <div id="invisible"><ul id="navigation"> <li><a href="/">Home</a></li> <li><a href="/randomness/">Introduction</a></li> <li><a href="/statistics/">Statistics</a></li> <li><a href="/integers/">Numbers</a></li> <li><a href="/quota/">Quota</a></li> <li><a href="/testimonials/">Testimonials</a></li> <li><a href="/faq/">FAQ</a></li> <li><a href="/mads/">Contact</a></li> <li><a href="/account/">Premium Login</a></li> <li><a href="/news/">What's New!</a></li> </ul> <h1><span><img src="/graphics/v2beta-128x32.png" width="128" height="32" alt="v2.0 beta" /><br />True Random Number Service</span></h1> <h2>Random Integer Generator</h2> <p>Here are your random numbers:</p> <pre class="data">8 19 9 96 83 59 12 18 77 34 53 82 73 26 49 18 71 93 55 74 40 69 40 92 100 5 43 61 95 46 38 75 15 29 12 57 35 83 56 49 31 15 79 83 43 27 39 69 37 52 2 66 68 20 81 19 67 22 88 50 98 49 64 94 66 80 40 94 52 97 99 1 25 83 56 97 19 3 62 7 19 94 7 8 84 52 15 82 82 50 42 76 23 63 65 46 100 68 7 73 </pre> <p>Timestamp: 2007-12-28 13:52:29 UTC</p> <p></p> <form method="get" action=""> <input type="hidden" name="num" value="100" /> <input type="hidden" name="min" value="1" /> <input type="hidden" name="max" value="100" /> <input type="hidden" name="col" value="5" /> <input type="hidden" name="base" value="10" /> <input type="hidden" name="format" value="html" /> <input type="hidden" name="rnd" value="new" /> <input type="submit" value="Again!" /> <input type="button" onclick="history.go(-1);" value="Go Back" /> </form> <p>Note: The numbers are generated left to right, i.e., <a href="/faq/#Q2.2" target="_blank">across columns</a>.</p> <p></p> <div class="ruler"></div> </div> </body> </html>
위에서 주의깊게 봐야할 부분은 랜덤한 숫자들이다.
#jockey --replay=1 더블유겟 -qO- 'http://www.random.org/integers/?num=100&min=1&max=100&col=5&base=10&format=html&rnd=new' Warning: /usr/bin/더블유겟 is, by default, excluded from tracing. Warning: I'm adding 'excludedprogram=-' option as a courtesy. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <title>RANDOM.ORG - Integer Generator</title> <link rel="stylesheet" type="text/css" href="/style.css" media="all" /> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <meta name="Keywords" content="true random numbers" /> <meta name="author" content="Mads Haahr" /> <script type="text/javascript" src="/random.js"></script> </head> <body> <div id="invisible"><ul id="navigation"> <li><a href="/">Home</a></li> <li><a href="/randomness/">Introduction</a></li> <li><a href="/statistics/">Statistics</a></li> <li><a href="/integers/">Numbers</a></li> <li><a href="/quota/">Quota</a></li> <li><a href="/testimonials/">Testimonials</a></li> <li><a href="/faq/">FAQ</a></li> <li><a href="/mads/">Contact</a></li> <li><a href="/account/">Premium Login</a></li> <li><a href="/news/">What's New!</a></li> </ul> <h1><span><img src="/graphics/v2beta-128x32.png" width="128" height="32" alt="v2.0 beta" /><br />True Random Number Service</span></h1> <h2>Random Integer Generator</h2> <p>Here are your random numbers:</p> <pre class="data">8 19 9 96 83 59 12 18 77 34 53 82 73 26 49 18 71 93 55 74 40 69 40 92 100 5 43 61 95 46 38 75 15 29 12 57 35 83 56 49 31 15 79 83 43 27 39 69 37 52 2 66 68 20 81 19 67 22 88 50 98 49 64 94 66 80 40 94 52 97 99 1 25 83 56 97 19 3 62 7 19 94 7 8 84 52 15 82 82 50 42 76 23 63 65 46 100 68 7 73 </pre> <p>Timestamp: 2007-12-28 13:52:29 UTC</p> <p></p> <form method="get" action=""> <input type="hidden" name="num" value="100" /> <input type="hidden" name="min" value="1" /> <input type="hidden" name="max" value="100" /> <input type="hidden" name="col" value="5" /> <input type="hidden" name="base" value="10" /> <input type="hidden" name="format" value="html" /> <input type="hidden" name="rnd" value="new" /> <input type="submit" value="Again!" /> <input type="button" onclick="history.go(-1);" value="Go Back" /> </form> <p>Note: The numbers are generated left to right, i.e., <a href="/faq/#Q2.2" target="_blank">across columns</a>.</p> <p></p> <div class="ruler"></div> </div> </body> </html>
출력된 숫자가 같은 것을 볼 수 있다.