タグ

perlとdebugに関するkamipoのブックマーク (21)

  • Perlのメモリリークを見つける方法 - Islands in the byte stream (legacy)

    Perlではメモリリーク検出ツールがいくつか開発されているので、top(1)の結果を眺めるよりそういうツールを使うほうが楽である。 さて、メモリリークが発生しているとき、その可能性としてはだいたい以下の4つが挙げられる。 Perlレベルでの循環参照 グローバル変数に値をどんどん足しているとき*1 XSレベルでリファレンスカウントの管理ミス XSレベルでmalloc()したメモリの管理ミス この1-3についてはすべてPerlインタプリタ内の出来事であり、Test::LeakTraceを使って検出できる。4を検出するのは難しいが、Test::Valgrindが役に立つ。 Test::LeakTraceのSYNOPSISは歴史的経緯によりごちゃごちゃしているが、テストで使うべき関数はno_leaks_ok()とleaks_cmp_ok()だけである。 たとえば、以下のようにして使う*2。 #!p

    Perlのメモリリークを見つける方法 - Islands in the byte stream (legacy)
  • Perlの中をgdbで覗く | BLOG - DeNA Engineering

    こんにちは。DeNAの樋口です。 Perlで書かれたアプリを動かしているときに、Perlのプロセスが今コードの何処を実行中なのか知りたいことがよくあります。そのような場合には、gdbで実行中のプロセスにアタッチし、Perlインタプリタインスタンスの内部を覗くことによって調べることができます。また同様の方法で、プロセスのコアダンプを取り、後でじっくりデバッガで調べることも可能です。 デバッグシンボル付きのPerlを用意する まず前提として、Perlの実行形式にデバッグシンボルが付いている必要があります。無い場合でも不可能ではありませんが、現実的には難しいでしょう。デバッグシンボル付きのPerlを用意する方法はOSによりますが、例えばrpmを使っているGNU/Linuxディストリビューションであればperl-debuginfoのように分離されたパッケージにデバッグシンボルが入っていることが多い

    Perlの中をgdbで覗く | BLOG - DeNA Engineering
  • このprintfデバッグからの卒業♪ - 葉っぱ日記

    こんにちは!近頃咳と痰と鼻水と鼻づまりがすごく多い、金曜日の天使ことhasegawayosukeです。 ActivePerlで任意のx86バイナリを実行しているようなときには、バイナリ部分のデバッグに結構手間取るときがあります。あまり準備に手間をかけずに気合いだけでad-hokに修正したいときは my $x86 = "\x8b\x44\x24\x08......"; print unpack( 'H2' x length( $x86 ), $x86 ); のように、実行するバイナリコードを目視で確認すればよいのですが、jmp命令が入るとアドレスの計算などがけっこう面倒になります。そんなときはやはりデバッガを使ってデバッグしたくなるのが人情なので、ActivePerlとデバッガをうまく連携させる方法を考えました。 Visual Studioがインストールされた環境では、「C:\Windows

    このprintfデバッグからの卒業♪ - 葉っぱ日記
  • perl - Devel::Leak : 404 Blog Not Found

    2006年12月08日11:00 カテゴリLightweight Languages perl - Devel::Leak そんなあなたに、Devel::Leak。 Rauru Blog ? Blog Archive ? 循環参照 ところが Scalar::Util 使って循環参照になってるとおぼしき変数を全部 weaken してみたんだけど、DESTORY されるかどうか見てみると、1サイクル終わっても1つだけ解放されないオブジェクトが残ってる。どうしちゃるかねとゆうわけで、今度は Devel::Cycle を CPAN から取って来てインストール。ところがこれ、参照元側のオブジェクトを1個指定して循環参照を検索するもんなんですね。どれが参照元なのかわからないので、やっぱり見つからないー。ただし、肝心のLeakしているオブジェクトまで表示させるには、-DDEBUGGING付きでcompi

    perl - Devel::Leak : 404 Blog Not Found
    kamipo
    kamipo 2009/03/25
    Devel::Leak::NoteSV Devel::Leak::CheckSV
  • いやなブログ - スクリプト言語用のデバッガの使い方 - Ruby, Python, Perl

    スクリプト言語用のデバッガの使い方 - Ruby, Python, Perl スクリプト言語用の CUIのデバッガの使い方を簡単にまとめました。対象言語は Ruby, Python, Perl です。 私は C, C++ でプログラムを書いているときはデバッガ (主に GNU/Linux 上の gdb) を頻繁に利用します。しかし、スクリプト言語ではそれほどでもありません。これはおそらく次のような理由によります。 ビルドが不要なので printf デバッグが容易 (ある程度大きい C++ のプログラムではビルド時間が長いので printf の挿入はしんどい) 異常終了時にスタックトレースが表示される (Ruby, Python なら自動、Perl の場合は use Carp; $SIG{__DIE__} = \&Carp::confess; など) オブジェクトのインスペクトが簡単 (Ru

    kamipo
    kamipo 2009/03/24
    use Carp; $SIG{__DIE__} = \&Carp::confess;
  • コールトレースを追うデバッグ用モジュール - daily dayflower

    Perl スクリプトをトレースするには Perl デバッガを使ってもいいですが,全体的な実行フローを追いたい場合 Devel::Trace が使えます。 たとえば #!/usr/bin/perl use strict; use warnings; my $i = 0; sub foo { bar(); baz(); } sub bar { baz(); } sub baz { $i ++; } foo(); みたいなスクリプトがあるときに,Devel::Trace でトレースするには下記のようにスクリプトを実行します。 $ perl -d:Trace test.pl実行結果は, >> test.pl:6: my $i = 0; >> test.pl:21: foo(); >> test.pl:9: bar(); >> test.pl:14: baz(); >> test.pl:18: $i

    コールトレースを追うデバッグ用モジュール - daily dayflower
    kamipo
    kamipo 2009/03/24
    Devel::Trace でトレースするには下記のようにスクリプトを実行します。 $ perl -d:Trace test.pl
  • 呼び出し元のコンテキストで eval する方法 - kazuhoのメモ置き場

    String::TT なんかがそうですけど、呼び出し元の変数を使いたい、ということがときどきあります。たとえば、 sub hello_to_alice { my $user = "Alice"; say_hello(); # "Hello to Alice!" と言ってほしい } って書きたいとか、そういうケースですね。結論から言うと、以下のように say_hello 関数を定義すれば可能です。こんな感じ。 sub say_hello { @_ = ('print "Hello to $user!\n"', undef); goto &DB::eval_in_parent_and_return; } package DB; sub DB::eval_in_parent_and_return { my ($expr, $retvar) = @_; eval("package " . (cal

    呼び出し元のコンテキストで eval する方法 - kazuhoのメモ置き場
    kamipo
    kamipo 2009/03/18
    perl デバッガを実装するために、DB パッケージ内での eval は呼び出し元のコンテキストで実行されるようになっている
  • Scalar::Util の weaken() - daily dayflower

    Shibuya.pm #9 での id:lestrrat さんの発表 での質疑応答において id:dankogai 氏 weak references の実装はどのようになっていますか? id:lestrrat 氏 あー準備してくるの忘れました。Scalar::Util の Util.xs を見てください :) というやりとりがありました。その時*1は weak reference の参照先の REFCNT を decrement している「だけ」じゃないの? と(あさはかにも)思ったんですが,実装を調べてみました。実際には「それだけ」ではありませんでした,と。 以下 REFCNT とか MAGIC とかでてくるんで,前提条件として Shibuya.pm #9 での :lestrrat さんの発表(Perl 5 internals の世界にようこそ - daisuke maki)必聴です。

    Scalar::Util の weaken() - daily dayflower
  • $@はグローバル変数

    あまり意識されていませんが、$@はグローバル変数です。気をつけないとおかしなことになります。以下のコードではdie()で例外を発生させているので「Error is Dummy error」と表示されるように見えますが、表示されません。 package Hoge; sub new { bless {}, shift } sub cleanup { # 色々処理 } sub DESTROY { my $self = shift; eval { $self->cleanup }; } package main; eval { my $hoge = Hoge->new(); die "Dummy error"; }; if ($@) { print "Error is $@\n"; } else { print "Everything OK!\n"; } evalがdie()によって終了し、スコー

    kamipo
    kamipo 2008/12/08
    evalがdie()によって終了し、スコープが切り替わる段階でDESTROYが呼ばれます。その中でeval{}をもう一度呼んでいますが、ここではエラーがなかったため$@が空に設定されるのです。
  • はてなグループの終了日を2020年1月31日(金)に決定しました - はてなの告知

    はてなグループの終了日を2020年1月31日(金)に決定しました 以下のエントリの通り、今年末を目処にはてなグループを終了予定である旨をお知らせしておりました。 2019年末を目処に、はてなグループの提供を終了する予定です - はてなグループ日記 このたび、正式に終了日を決定いたしましたので、以下の通りご確認ください。 終了日: 2020年1月31日(金) エクスポート希望申請期限:2020年1月31日(金) 終了日以降は、はてなグループの閲覧および投稿は行えません。日記のエクスポートが必要な方は以下の記事にしたがって手続きをしてください。 はてなグループに投稿された日記データのエクスポートについて - はてなグループ日記 ご利用のみなさまにはご迷惑をおかけいたしますが、どうぞよろしくお願いいたします。 2020-06-25 追記 はてなグループ日記のエクスポートデータは2020年2月28

    はてなグループの終了日を2020年1月31日(金)に決定しました - はてなの告知
    kamipo
    kamipo 2008/09/24
    TESTAPP_EXIT_OK=1 perl -MDevel::Leak::Object=GLOBAL_bless script/testapp_server.pl -d
  • Perlのデバッグ

    Perlのデバッガ(コマンドのまとめ) by Hippo2000(1999/1/14) Perl5からは標準でデバッガがついています。(-dオプション) そこで、その「コマンドのまとめ」なのです。 この文書は、ActivePerlのオンラインマニュアルのPerldebug(C:\Perl\html\lib\Pod\perldebug.html)をベースにしています。 でもメモリ使用や正規表現のデバッグについては、いまのところ、まとめる気はありません。(興味がないのね) まだ工事中です。(完成予定はいつだろう...) 目次 1. 起動方法 2. コマンド 2.1 コマンド一覧 2.2 オプション一覧 3. 使うときのポイント 参考資料 1. デバッガモードで起動、終了 Perlをデバッガモードで起動するためには-dオプションをつけて、実行します。 すると実行する最初スクリプトの行か

  • perl - B::Deparse : 404 Blog Not Found

    2007年02月11日13:45 カテゴリLightweight Languages perl - B::Deparse 尻馬乗るべし、ということでB::Deparseの紹介。 いやなブログ - スクリプト言語用のデバッガの使い方 - Ruby, Python, Perl スクリプト言語用の CUIのデバッガの使い方を簡単にまとめました。対象言語は Ruby, Python, Perl です。実は私も、デバッガーはperl -de1ぐらいしか使っていない(perl -de1は非常によく使うので、Terminal.appのウィンドウの一つがそれ専用になっている。スクリプト言語のインタラクティブな利用法に関しては以前「404 Blog Not Found:LL Intaractive」にまとめたのでそちらをご覧頂くとして、ここではなぜスクリプト言語では滅多にデバッガーを使わないかをおさらいした

    perl - B::Deparse : 404 Blog Not Found
    kamipo
    kamipo 2008/08/27
    perl -MO=Deparse -i.bak -ple 's/0\0.1/0.02/g'
  • Perlプログラマのためのgdb入門(at Shibuya.pm #9 LT) - とあるはてな社員の日記

    先日のShibuya.pm #9のLightening Talkで「gdbでXS on mod_perlをデバッグ」という話をしてきました。XSを使い出すと、従来のPerl的デバッグだけでは不十分なのでgdbをうまく使って、効率的にデバッグしましょう、という話です。実は、はてな社内では1年近く前に勉強で話したネタだったのですが、ようやく公開することができました。 Shibuya.pmでは5分という枠があったのでショートver.でしたが、ここでは制限はないので、来のロングバージョンの資料をアップします。ちょっと公開できない情報が混っていたので、xxxで隠していますが、ご了承ください。 ちなみに、Rubyとかでも似た感じでデバッグできると思うので、そちらの人も参考にしてください。長いよ!という人は、最後の「これは設定しておけ的gdb初期化マクロ」だけでもどうぞ。かなり便利です。 (資料公開が

    Perlプログラマのためのgdb入門(at Shibuya.pm #9 LT) - とあるはてな社員の日記
  • Perlゼミ(サンプルコードPerl入門)

    Perl入学式 全6回のPerl入門講座。東京、大阪、沖縄、札幌で開催。(東京は4月と10月スタート、それ以外は5月スタート) YAPC::Japan Perlを軸としたITに関わる全ての人のためのカンファレンス。 東京 吉祥寺.pm 五反田.pm 大阪 なにわPerl 沖縄 沖縄.pm

    kamipo
    kamipo 2008/04/25
    $DB::single = 1; #コードの中でブレイクポイントを設定(便利)
  • どの行が実行されているかを見る(実行トレース) - ヒルズで働く@robarioの技ログ

    Net::MSN - metacpan.orgを使ってごにょごにょしようとしたら、途中でSegmentation faultを起こしてログインすらできなかった。perl自体が落ちてしまうし、perl -dも固まってしまう始末。 そこでとりあえずどのモジュールが悪いのか調べたく、トレースを見ることにした。"trace"でCPANを検索。色々試した結果、Devel::Trace - Print out each line before it is executed (like sh -x) - metacpan.orgがBest Practiceのよう。 早速デバッグ。 $ cpan Devel::Trace $ perl -d:Trace MSN.pl (略) >> /usr/lib/perl5/site_perl/5.8/cygwin/Crypt/SSLeay/MainContext.pm

    どの行が実行されているかを見る(実行トレース) - ヒルズで働く@robarioの技ログ
    kamipo
    kamipo 2008/02/27
    perl -d:Trace MSN.pl
  • Devel::DProf

    perlスクリプトの実行速度を分析するプロファイラ。 プロファイラとは CGIを作っていて、もう少し早くならんかなと思うことは良くあります。 そんな時、やたらめったら適当にいじくっていても、それが実際 スピードアップに貢献しているとは限りません。 そういう時はプロファイラを使ってどの部分が遅いのか、 どこを改良すればいいのかを分析するべきです。 Perlにもプロファイラが用意されています。しかし、残念ながら 標準ではなくて自分でCPANから インストールしなくてはいけません。 Devel::DProf の構成 Devel::DProf には二つの部品があります。プログラム実行中にデータを 収集する為のPerl モジュールである Devel::DProf と、集めたデータを 整形して見やすく表示するコマンドの dprofpp です。 作業の手順としては、スクリプトに組み込んだ Devel::

    kamipo
    kamipo 2008/01/29
    perl -d:DProf [テストしたいプログラム] && dprofpp
  • svk を当社比100倍高速化する方法: blog.bulknews.net

    svk を当社比100倍高速化する方法 svk を使っているときの最大の不満は、ローカルのミラーレポジトリが大きくなるにつれ各種操作、とくに checkout と commit が遅くなってくること。 既知の問題だとおもっていたんですが、plagger のリリースに15分くらいかかるようになったのでたまらず #perl6 で clkao をつかまえてクレーム。「そんな遅いはずはないので Devel::DProf で dprofpp の結果おくってよ」とのこと。さっそくやってみるとほとんどが Data::Hierarchy の _ancestors 関数でした。 というわけで clkao が Data::Hierarchy 0.32 をリリースしてくれた。Changes に "Workaround various performance issues. The real fix will b

  • Yet Another Hackadelic - Devel::DProfを使って簡単にプログラムの流れをつかむ

    Devel::DProfを使うと簡単にプログラムの流れを把握出来ます。*1 例えばinc::Module::Installの初期化処理ってどんなんだろうと思ったら、 $ perl -d:DProf -Minc::Module::Install -e 'use inc::Module::Install'ってやるとそのディレクトリにtmon.outってファイルが出来てます。 tmon.outを直接見ても良いのですが、きちんとこのprofileデータをparseするコマンドが付属しています。それがdprofppコマンドです。 下記のような使い方をすると流れがつかめていい感じかもです。 $ dprofpp -T | grep Module::Install | uniq inc::Module::Install::BEGIN Module::Install::BEGIN Module::Insta

    Yet Another Hackadelic - Devel::DProfを使って簡単にプログラムの流れをつかむ
    kamipo
    kamipo 2008/01/29
    perl -d:DProf -Minc::Module::Install -e 'use inc::Module::Install'
  • die しても Sledge::Plugin::DebugScreen で出しましょう 2 : にぽたん研究所

    さて「id:tokuhirom だけが支えている」と言われつつも、空前の Sledge ブームなわけですが、ちょうどさっきのエントリを書いてたら、id:tokuhirom が既に対応してたりしました…。 で、その後に MoFedge::Plugin::TokuLog! - StackTrace とソースコードhttp://tokuhirom.dnsalias.org/~tokuhirom/tokulog/93183.html まぁ、↑こんな感じで、ソースコードの前後3行ぐらいを表示してくれると最強っぽい。 とか言って「いいもの使ってる感」だけでは不十分だとのたまうので、まぁ確かに最強っぽげだったのでやってみる価値はありそげでしたね。 やってみたらこんなんなりました。 例によって patch による提供ですが。 0.01 にあてる patch --- DebugScreen.pm Mon D

  • Stacktrace付きdie : blog.nomadscafe.jp

    Stacktrace付きdie ログをもう少し詳しくしたいなぁと思って調べていて、Error.pmのソースで気がついたんけど、 eval { die Foo->new; } warn ref $@; #Foo が使えるんですね。 Sledge::Plugin::DebugScreenとか、CGI::Applicationだと$self->{__stacktrace}で情報を保存しているけど、$@を利用してstacktrace情報を受け渡すことができるよな、と考えたので書いてみた package MyApp::Exception; use strict; use warnings; use base qw/Class::Accessor::Fast Exporter/; use Devel::StackTrace; use overload '""' => 'as_string'; __PA

    kamipo
    kamipo 2008/01/23
    $SIG{__DIE__} = \&Carp::confess;