[Vienna-pm] Kein Source-Code im Debugger

Peter J. Holzer hjp-vienna-pm-list at hjp.at
Sat Feb 24 10:59:37 PST 2007


Mir ist das in letzter Zeit öfter passiert:

Wenn ich ein perl-Programm im Debugger durchgehe, bekomme ich für manche
Source-Files (oder manchmal auch nur für Teile eines Source-Files)
keinen Source-Code zu sehen, sondern nur die Zeilennummern:

Hier ein Transscript:

[...]
| 36:             print "# Running $method tests for plugin " . $plugin->plugin_name . "\n";
|   DB<1>
| # Running test tests for plugin require_resolvable_client
| Qpsmtpd::Plugin::run_tests(/home/hjp/wrk/qpsmtpd/trunk/t/Test/Qpsmtpd/Plugin.pm:37):
| 37:             local $plugin->{_qp} = $qp;
|   DB<1>
| Qpsmtpd::Plugin::run_tests(/home/hjp/wrk/qpsmtpd/trunk/t/Test/Qpsmtpd/Plugin.pm:38):
| 38:             $plugin->$method();

Bis hierher ist alles in Ordnung, jetzt gehe ich in die Methode rein:

|   DB<1> s
| Qpsmtpd::Plugin::require_resolvable_client::test(t/plugin_tests/require_resolvable_client:8):
| 8:

Ups. Da steht nur mehr "8:" und nicht "8:     my ($self) = @_;", wie es
sein sollte. Wenn ich weitergehe, bleibt das so:

|   DB<1> n
| Qpsmtpd::Plugin::require_resolvable_client::test(t/plugin_tests/require_resolvable_client:9):
| 9:
|   DB<1>
| Qpsmtpd::Plugin::require_resolvable_client::test(t/plugin_tests/require_resolvable_client:10):
| 10:
|   DB<1>
| Qpsmtpd::Plugin::require_resolvable_client::test(t/plugin_tests/require_resolvable_client:11):
| 11:
|   DB<1>
| Qpsmtpd::Plugin::require_resolvable_client::test(t/plugin_tests/require_resolvable_client:12):
| 12:
|   DB<1>
| Qpsmtpd::Plugin::require_resolvable_client::test(t/plugin_tests/require_resolvable_client:13):
| 13:
|   DB<1>
| ok 1 - example.com is 192.0.34.166

Zeile 13 sollte genau das ausgeben. Das Programm funktioniert also, man
ist nur im Blindflug unterwegs.

Kennt jemand von Euch das Phänomen?

In diesem speziellen Fall habe ich eine Theorie, woran es liegen könnte:
Das File t/plugin_tests/require_resolvable_client wurde nicht mit "use"
oder "require" eingelesen. Statt dessen wurde ein String, der die Zeile 

#line 1 t/plugin_tests/require_resolvable_client

enthält, "eval"uiert (Der Code wird aus mehreren Files und etwas
Boilerplate zusammengebastelt, daher die seltsame Konstruktion).
Der Debugger weiß offensichtlich, wo er sein sollte (Filename und
Zeilennummer stimmen), findet aber den dazupassenden Source nicht. Ich
sehe bei einem strace auch nicht, dass der Debugger dieses oder ein
anderes File extra öffnen würde - wird bei einem require oder use der
Source-Code gespeichert?

In anderen Fällen, in denen mir das untergekommen ist, war aber IIRC
kein eval beteiligt - das waren "ganz normale" Perl-Module.

	hp


-- 
   _  | Peter J. Holzer    | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR       | > ist?
| |   | hjp at hjp.at         | Was sonst wäre der Sinn des Erfindens?
__/   | http://www.hjp.at/ |	-- P. Einstein u. V. Gringmuth in desd
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://mail.pm.org/pipermail/vienna-pm/attachments/20070224/d5930153/attachment.bin 


More information about the Vienna-pm mailing list