Debuggen von @INC

Debuggen von @INC

am 17.09.2007 11:58:35 von Ferry Bolhar

Hallo,

ich habe ein Modul, das in einem BEGIN-Block eine Codereferenz
an den Beginn von @INC legt:

BEGIN {
unshift @INC, \&set_inc;
}

Nun wird set_inc() jedesmal aufgerufen, wenn Perl in der Folge
Modulcode mit 'use' oder 'require' lädt, wobei der Funktion als
erstes Argument eine Codereferenz von sich selbst und als zweites
Argument der Name der zu ladenden Moduldatei übergeben wird.
So weit, so gut.

Unglücklicherweise funktioniert innerhalb von set_inc() etwas
nicht wie erwartet, und ich würde die Funktion gerne debuggen.
Nur - wie? Wenn ich das Skript mit -d starte, sind alle mit "use"
eingebundenen Module längst geladen und set_inc() ist fertig. Wie
kann ich eine solche Funktion debuggen?

Danke und LG,

Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: Debuggen von @INC

am 17.09.2007 12:00:58 von Moritz Lenz

This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
--------------enig3C0E2DCD0E8E0D48F812703F
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hallo,

Ferry Bolhar wrote:
> Unglücklicherweise funktioniert innerhalb von set_inc() etwas
> nicht wie erwartet, und ich würde die Funktion gerne debuggen.
> Nur - wie? Wenn ich das Skript mit -d starte, sind alle mit "use"
> eingebundenen Module längst geladen und set_inc() ist fertig. Wie
> kann ich eine solche Funktion debuggen?

mit print, warn und Data::Dumper.

HTH,
Moritz

--=20
Moritz Lenz
http://perl-6.de/ http://moritz.faui2k3.org/


--------------enig3C0E2DCD0E8E0D48F812703F
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFG7lBdAAkekJBI0yIRAmkgAKC2IXg8dytjPzNTRXnMNn5WC964rgCf QLKY
cgCVJq+VbRfSScS6Xb39B7Q=
=Uf+Z
-----END PGP SIGNATURE-----

--------------enig3C0E2DCD0E8E0D48F812703F--

Re: Debuggen von @INC

am 17.09.2007 15:35:15 von Ferry Bolhar

Moritz Lenz:

>> Unglücklicherweise funktioniert innerhalb von set_inc() etwas

>> nicht wie erwartet, und ich würde die Funktion gerne debuggen.

>> Nur - wie? Wenn ich das Skript mit -d starte, sind alle mit "use"

>> eingebundenen Module längst geladen und set_inc() ist fertig. Wie

>> kann ich eine solche Funktion debuggen?

> mit print, warn und Data::Dumper.

Naja, soweit war ich auch schon - ist aber ziemlich umständlich.

Den Perl-Debugger dazu zu bringen, auch diese Code zu debuggen,

ist nicht möglich?

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: Debuggen von @INC

am 17.09.2007 15:51:48 von Christian Winter

Ferry Bolhar schrieb:
> Hallo,
>
> ich habe ein Modul, das in einem BEGIN-Block eine Codereferenz
> an den Beginn von @INC legt:
>
> BEGIN {
> unshift @INC, \&set_inc;
> }
>
> Nun wird set_inc() jedesmal aufgerufen, wenn Perl in der Folge
> Modulcode mit 'use' oder 'require' lädt, wobei der Funktion als
> erstes Argument eine Codereferenz von sich selbst und als zweites
> Argument der Name der zu ladenden Moduldatei übergeben wird.
> So weit, so gut.
>
> Unglücklicherweise funktioniert innerhalb von set_inc() etwas
> nicht wie erwartet, und ich würde die Funktion gerne debuggen.
> Nur - wie? Wenn ich das Skript mit -d starte, sind alle mit "use"
> eingebundenen Module längst geladen und set_inc() ist fertig. Wie
> kann ich eine solche Funktion debuggen?

perl -d -e 'do "meinscript.pl"'?

-Christian

Re: Debuggen von @INC

am 17.09.2007 16:19:47 von Frank Seitz

Ferry Bolhar wrote:

> Den Perl-Debugger dazu zu bringen, auch diese Code zu debuggen,
> ist nicht möglich?

Du kannst Compile-Time Code wohl tracen, aber keine Breakpoints setzen
(siehe perl perldebug, Abschnitt "Debugging compile-time statements").

Debugge die Funktion einfach mit einem require- statt einem use-Aufruf,
dann solltest Du keine Beschränkungen haben.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: Debuggen von @INC

am 18.09.2007 10:31:35 von Ferry Bolhar

Christian Winter:

>> Wie kann ich eine solche Funktion debuggen?
>
> perl -d -e 'do "meinscript.pl"'?

Das funktioniert leider nicht.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: Debuggen von @INC

am 18.09.2007 10:31:58 von Ferry Bolhar

Frank Seitz:

> Debugge die Funktion einfach mit einem require- statt einem use-Aufruf,
> dann solltest Du keine Beschränkungen haben.

Danke, Frank! Man muss:

1) Am Beginn

BEGIN {
$DB::single = 1;
}

schreiben.

2) Eine Breakpoint auf die Funktion, die man beim "unshift @INC"
angegeben hat, setzen (daher muss diese benannt sein, man darf
also nicht

unshift @INC, sub {....};

schreiben.

3) Wie du vorgeschlagen hast, statt "use" "require" verwenden.

Dann hält der Debugger bei der Ausführung des "require" am
Beginn der Funktion an. Etwas Umständlich, aber so geht's.

Danke nochmals!

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at