'디버깅'에 해당되는 글 2건

  1. 2011.02.26 실용주의 디버깅 2
  2. 2009.11.17 Perl Debug command 정리
Books2011. 2. 26. 08:13

폴 부처 지음

"개발에도 정석이 있다면 디버깅에도 정석이 있다." 라는 관점에서 지어진 책이다. 

이 책은 실용주의라는 것으로 포장되어 있어서 구입을 했지만 (그런면에서는 나도 참 낚시질에 많이 당하는 편이다.)
실용주의라는 것 보다는 원칙주의에 가깝다. 원리 원칙에 맞는 디버깅을 해야 한다는 것을 강조하고 그에 관해서
원리 원칙대로의 접근법을 설명하고 있다.

디버깅 툴을 이렇게 써야 되요라고 하지 않고 
디버깅은 이런 정신 상태로 해야 해요 라고 설명하는 책인 것이다.

문제의 핵심
큰 그림
디버깅 비급

3부분으로 나누어서 설명하며,

제일 먼저 나오는 1부 문제의 핵심은  디버깅이 필요한 즉 버그가 있는 포인트를 찾아들어가는 방법과 원칙을 설명한다.
2부 큰 그림에서는  개발 조직내와 개발 조직 외부와의  의사소통과 개발에 대한 회사 정책을 다룬다. 
3부 디버깅 비급에서는 오랫동안의 경험에 따른 다양한 디버깅 방법론을 설명하고 있다.  
설명을 단순한 디버깅 방법론이라고 하였지만,  디버깅 정책이라던가 개발방법론과 엮어서 설명하고
회사나 팀의 운영 정책과 연관지어서 설명하기 때문에 전체를 볼 수 있는 시각을 기를 수 있다.

사실 디버깅은 개발자라면 누구가 부딪치는 숙명적인 문제이기 때문에
누구나 자신만의 노우하우를 가지고 수행한다.
결국 자신의 노우하우가  되고, 코딩시에 가이드까지 , 결국에는 설계시에 가이드 까지 제시해준다면
그것이야 말로 자신만의 규화보전이 될 것이다.

이 책은 저자가 자신의 경험을 바탕으로 만든 규화보전에 가까운 책이다.
다만, 어느정도 궤도에 오른 사람이 본다면,  정석적인 말을 나열한다고 느낄 수 있다.
바둑을 제외하고는 정석을 지키기 힘들기 때문에 정석일 수 있다. 

초보자나 중급자가 보고 디버깅에 관한 내용을 배우기에 좋은 책이다.
Posted by GUNDAM_IM
Hobby2009. 11. 17. 13:32
요새 갑자기 안쓰던 Perl을 쓸일이 생겨서 Perl을 열심히 공부하고 있습니다.
그렇다고 새로 짜는것도 아니고 전문가가 (정말 Perl의 전문가) 께서 작성한 코드를 디버깅 해야 하는 상황이 발생해서 고생하고 있습니다.

이리저리 하다가 필요한 것이 Perl 디버깅 커맨드를 따로 정리해 두는 것이 편할 것 같아서 정리해둡니다.
관련 내용은 아래 페이지에서 발췌했습니다.

대부분은 GDB 커맨드랑 비스므레 하기 때문에 쉽게 다가설 수 있습니다.
모듈 로딩 이라던가 기타 등등은 디버깅에서 확인하면 도움이 됩니다.

http://www.devshed.com/c/a/Perl/Using-The-Perl-Debugger/
 
요기 아래 링크로 가면 좀더 자세한 디버깅 정보를 확인할 수 있습니다.
설명도 좋고..
http://doc.perl.kr/twiki/bin/view/Perldoc/PerlDebtut


1. 디버깅 모드에 들어가기


펄은 자체적으로 디버깅 환경을 가지고 있습니다.

perl -d로 수행하면 되고 대개의 경우 스크립트 제일 처음에 있는

#/usr/bin/perl

라인에

#/usr/bin/perl  -d

옵션을 추가해서 실행하면 자동적으로 디버깅 모드에 들어갑니다.

2. 리스트 보기


"l" (L) 입니다. (I)가 아니고..
을 넣으면 스크립트 라인을 보여줍니다.

DB<1> l

6==> unless($ARGV[0])
7 {
8: print "ERROR: Please provide a valid input ID\n\n";
9 }
10
11 # get user input into variable
12: my $id = $ARGV[0];
13
14 # connect
15 # fix these as per your local settings

"l <line number>"로 지정된 라인을 볼 수 있습니다.

DB<3> l 19
19==> my $sendmail = "/usr/sbin/sendmail -t";


아니면 지정된 라인부터 몇 라인 까지 본다면

"l 20-25"
로 하면 됩니다.

DB<4> l 20-25
20==> my $reply_to = "Reply-to: foo\@bar.org";
21: my $subject = "Subject: FOOBAR";
22: my $content = "Hello and how are you doing? This is the message body";
23
24 # now retrieve email addresses and send mail to each
25: my $sth = $dbh->prepare("SELECT email FROM users WHERE users.id =
'$id'");


"V <line number>" 는 주어진 라인 을 기준으로 전후 라인을 보여줍니다.
DB<3> v 27
24: my $description = $ref->{'description'};
25: $sth->finish();
26
27 # now use the group ID to get the group text
28: my $sth = $dbh->prepare("SELECT group_text FROM groups WHERE
group_id =
'$gid'");
29: $sth->execute();
30: my $ref = $sth->fetchrow_hashref();
31: my $gtext = $ref->{'group_text'};
32: $sth->finish();
33

문자열을 찾고 싶다면 vi처럼

"/STRING" 을 하면 됩니다.

DB<3> /FOOBAR
21: my $subject = "Subject: FOOBAR";

3. 실행하기


다음 라인을 수행하고 싶다면

"s" 를 하면 됩니다.

main::(mailer.pl:6): unless($ARGV[0])
main::(mailer.pl:7): {
DB<1> s
main::(mailer.pl:12): my $id = $ARGV[0];
DB<1> s
main::(mailer.pl:16): my $dbh =
DBI->connect("DBI:mysql:database=db198;host=localhost", "root",
DBI->"secret",
{'RaiseError' => 1}) or die ("Cannot connect to database");
DB<1> s DBI::connect(/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi/DBI.pm
:442):
442: my $class = shift;
DB<1> s DBI::connect(/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi/DBI.pm
:443):

s 명령어는 gdb와 마찬가지로 한스텝씩 실행하면서 진행하고 서브 루틴이 나오면 해당 서브루틴으로 들어가서 수행하게 됩니다.

서브 루틴을 건너 뛰면서 수행하는 것은 gdb와 마찬가지로 n 입니다.

main::(mailer.pl:6): unless($ARGV[0])
main::(mailer.pl:7): {
DB<1> n
main::(mailer.pl:12): my $id = $ARGV[0];
DB<1> n
main::(mailer.pl:16): my $dbh =
DBI->connect("DBI:mysql:database=test;host=localhost", "root", "",
{'RaiseError' => 1}) or die ("Cannot connect to database");
DB<1> n



서브 루틴 안에 있다면 서브 루틴의 끝까지 수행하여야 하는 경우
"r" 명령을 이용해서 서브 루틴의 끝까지 진행할 수 있도록 합니다.

DB<1> s DBI::connect(/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi/DBI.pm
:443):
443: my($dsn, $user, $pass, $attr, $old_driver) = @_;
DB<1> r
scalar context return from DBI::connect: empty hash
main::(mailer.pl:19): my $sendmail = "/usr/sbin/sendmail -t";



4. 값을 보기

변수들의 값을 확인하는 방법입니다.
gdb와 같은 방식을 취하고 있습니다.

"x"  명령은 변수의 값을 확인할 수 있습니다.

DB<7> @friends = qw(Rachel Ross Joey Monica Chandler Phoebe);

DB<8> x @friends
0 'Rachel'
1 'Ross'
2 'Joey'
3 'Monica'
4 'Chandler'
5 'Phoebe

"p" 명령은 값을 프린트 할 수 있습니다.

DB<4> p $sendmail
/usr/sbin/sendmail -t

DB<7> $movie="Star Wars"

DB<8> p $movie
Star Wars


"V package_name"  명령은 지정된 패키지의 정보와 모든 내부 변수를 확인할 수 있습니다.

DB<32> V DBI
%DBI_methods = (
'db' => HASH(0x81e292c)
'CLEAR' => HASH(0x8281ff8)
'O' => 4
'DESTROY' => undef
'EXISTS' => HASH(0x8281ff8)
-> REUSED_ADDRESS
'FETCH' => HASH(0x808b198)
'O' => 1028
'FIRSTKEY' => HASH(0x8281ff8)
-> REUSED_ADDRESS
'NEXTKEY' => HASH(0x8281ff8)
-> REUSED_ADDRESS
'STORE' => HASH(0x8284968)
'O' => 1040
'_not_impl' => undef
'begin_work' => HASH(0x83155a8)
'O' => 1024
'U' => ARRAY(0x831556c)
0 1
1 2
2 '[ \\%attr ]'
'column_info' => HASH(0x81e2680)
'O' => 512
'U' => ARRAY(0x81e2644)
0 1
1 6
2 '$catalog, $schema, $table, $column [, \\%attr ]'
'commit' => HASH(0x8315608)
'O' => 1152
'U' => ARRAY(0x83155d8)
0 1
1 1
...


"X" 명령은 스크립트 전체의 변수와 환경 변수 등에 대한 모든 정보를 덤프시킵니다.

DB<32> X
FileHandle(STDIN) => fileno(0)
$^V = "\cE\cH\c@"
$2 = ''
$1 = 'main'
$movie = 'Star Wars'
$^WARNING_BITS = "\c@\c@\c@\c@\c@\c@\c@\c@\c@\c@\c@\c@"
$< = 515
FileHandle(stdin) => fileno(0)
@ARGV = (
0 'ueruir'
)
@INC = (
0 '/usr/lib/perl5/5.8.0/i386-linux-thread-multi'
1 '/usr/lib/perl5/5.8.0'
2 '/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi'
3 '/usr/lib/perl5/site_perl/5.8.0'
4 '/usr/lib/perl5/site_perl'
5 '/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi'
6 '/usr/lib/perl5/vendor_perl/5.8.0'
7 '/usr/lib/perl5/vendor_perl'
8 '.'
)
%INC = (
'AutoLoader.pm' => '/usr/lib/perl5/5.8.0/AutoLoader.pm'
'Carp.pm' => '/usr/lib/perl5/5.8.0/Carp.pm'
'Carp/Heavy.pm' => '/usr/lib/perl5/5.8.0/Carp/Heavy.pm'
'Config.pm' => '/usr/lib/perl5/5.8.0/i386-linux-thread-multi/Config.pm'
'DBD/mysql.pm' => '/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBD/mysql.pm'


"M"은 로딩된 모든 모듈에 대한 정보를 보여줍니다.

DB<32> M
'AutoLoader.pm' => '5.59 from /usr/lib/perl5/5.8.0/AutoLoader.pm'
'Carp.pm' => '1.01 from /usr/lib/perl5/5.8.0/Carp.pm' 'Carp/Heavy.pm' => '/usr/lib/perl5/5.8.0/Carp/Heavy.pm'
'Config.pm' => '/usr/lib/perl5/5.8.0/i386-linux-thread-multi/Config.pm'
'DBD/mysql.pm' => '2.0416 from /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBD/mysql.pm'
'DBI.pm' => '1.30 from /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi/DBI.pm'
'DynaLoader.pm' => '1.04 from /usr/lib/perl5/5.8.0/i386-linux-thread-multi/DynaLoader.pm'
'Exporter.pm' => '5.566 from /usr/lib/perl5/5.8.0/Exporter.pm' 'Exporter/Heavy.pm' => '5.566 from /usr/lib/perl5/5.8.0/Exporter/Heavy.pm'
'Term/Cap.pm' => '1.07 from /usr/lib/perl5/5.8.0/Term/Cap.pm' 'Term/ReadLine.pm' => '1.00 from /usr/lib/perl5/5.8.0/Term/ReadLine.pm'
'dumpvar.pl' => '/usr/lib/perl5/5.8.0/dumpvar.pl'
'perl5db.pl' => '1.19 from /usr/lib/perl5/5.8.0/perl5db.pl' 'strict.pm' => '1.02 from /usr/lib/perl5/5.8.0/strict.pm' 'vars.pm' => '1.01 from /usr/lib/perl5/5.8.0/vars.pm' 'warnings.pm' => '1.00 from /usr/lib/perl5/5.8.0/warnings.pm' 'warnings/register.pm' => '1.00 from /usr/lib/perl5/5.8.0/warnings/register.pm'

소문자 로 쓰여진

"m Package_name"은 지정된 패키지의 함수 등에 대한 정보를 보여줍니다.

DB<33> m DBI
CLONE
_clone_dbis
_dbtype_names
_debug_dispatch
_rebless
_rebless_dbtype_subclass
_set_isa
_setup_driver
available_drivers
bootstrap
carp
confess
connect
connect_cached
connect_test_perf
constant
croak
data_sources
dbi_profile
via Exporter: export_ok_tags
via Exporter: export_tags
via Exporter: export_to_level
via DynaLoader: AUTOLOAD
via DynaLoader: boot_DynaLoader
via DynaLoader: dl_install_xsub
...

마지막으로 "S" 명령은 현재 스크립트및 로딩된 스크립트에서의 서브 루틴 리스트를 모두 보여줍니다.

DB<35> S
AutoLoader::AUTOLOAD
AutoLoader::BEGIN AutoLoader::__ANON__[/usr/lib/perl5/5.8.0/AutoLoader.pm:96]
AutoLoader::import
AutoLoader::unimport
Carp::BEGIN
Carp::caller_info
Carp::carp
Carp::cluck
Carp::confess
Carp::croak
Carp::export_fail
Carp::format_arg
Carp::get_status
DBD::mysql::AUTOLOAD
DBD::mysql::BEGIN
DBD::mysql::_OdbcParse
DBD::mysql::_OdbcParseHost
DBD::mysql::db::ANSI2db
DBD::mysql::db::BEGIN
DBD::mysql::db::_SelectDB
DBD::mysql::db::admin
DBI::BEGIN
DBI::CLONE
DBI::DBI_tie::STORE
...


"s string"은 string으로 지정된 문자열을 포함한 함수 혹은 변수의 리스트를 보여줍니다.

DB<35> S connect
DBD::_::db::disconnect
DBD::_::dr::connect
DBD::_::dr::connect_cached
DBD::_::dr::disconnect_all
DBD::mysql::dr::connect
DBI::connect
DBI::connect_cached
DBI::connect_test_perf
DBI::disconnect
DBI::disconnect_all






'Hobby' 카테고리의 다른 글

아~~~ 아~~~ 얄미운 아이폰  (0) 2009.12.09
[DQ9] 오오 드디어 엔딩으로  (0) 2009.11.17
[DQ9] 드디어 마지막 장으로....  (0) 2009.11.12
Dragon Quest IX 열랩하기  (0) 2009.11.05
MockUp-재미있는 GUI Outliner 프로그램  (0) 2009.09.23
Posted by GUNDAM_IM