2011-01-14 13 views

risposta

7

Hai provato ad aggiungere l'opzione -d alla riga shebang nella parte superiore dello script? Qualcosa di simile

#!/usr/bin/perl -d 
use strict; 
use warnings; 
$|=1;$\="\n"; 

print "Test"; 

Dipende esattamente come viene lanciato, ma almeno nei casi più semplici questo dovrebbe avviare il debugger.

Edit: È quindi possibile impostare un punto di interruzione su una linea specifica con una certa condizione utilizzando

> b [line] [condition] 

e ha colpito

> c 

per continuare con l'esecuzione dello script - il debugger si fermerà davanti a la linea specificata quando la condizione è soddisfatta

+0

È grandioso. C'è una sintassi simile su Windows? – Thomson

+1

Credo che perl rispetterà gli switch anche se l'effettivo lancio perl eseguibile non è quello elencato nello shebang - cioè, anche se lo script precedente è avviato come, per esempio, C: \ Perl \ bin \ perl.exe script.pl , dovrebbe comunque avviare il debugger – ivancho

3

Bene, c'è qualcosa che ti permetterà di fare qualcosa come i punti di interruzione, ma la funzionalità è più ampia: Perl Debugger.

+0

Può funzionare quando non riesco a cambiare il metodo di lancio (la riga di comando dell'eseguibile perl)? – Thomson

+1

il metodo di lancio è essenziale, non è possibile utilizzare il debugger senza opzione -d – Thariama

2

In sostanza lo switch -d consente di comunicare con l'eseguibile perl e consente al perl eseguibile di comunicare con l'utente.

More

+0

Il mio pezzo di codice perl fa parte di un sistema di grandi dimensioni e non riesco a controllare come viene avviato. Sembra che posso solo modificare il file sorgente per farlo. – Thomson

+3

@ Tan Tan: In tal caso, la registrazione funzionerebbe meglio. Dai un'occhiata a [Log :: Log4perl] (http://search.cpan.org/perldoc?Log::Log4perl). –

34

Se ho capito bene, è necessario utilizzare una variabile debugger specifica nel codice - $DB::single. Impostando questo su un valore reale nel codice, il debugger si fermerà su quella linea.

$x = 1234; 
$DB::single = 1; 
enter_problematic_sub_now(); 

vostro codice sarà poi fermarsi alla linea con $ DB :: unico set a 1.

Naturalmente, se non si può effettivamente garantire che il codice viene eseguito nel debugger poi si deve un altro problema interamente. Si sarà necessario eseguire il codice tramite perl -d pure.

+0

Vuoi dire se il mio programma non viene eseguito nel debugger, non posso usare $ DB :: single come previsto? – Thomson

+3

@Thompson: Sì, è vero. Se si desidera eseguire il debug di un programma Perl, è necessario eseguirlo con un debugger. Per quanto ne sappia, questo genere di cose è valido per la maggior parte dei tipi di debug in tempo reale basati su sorgenti in altre lingue, nonostante il post-mortem dei coredumps. – tchrist

+0

@tchrist Non sono sicuro di come funzioni internamente in Python, ma posso fare 'import pdb; pdb.set_trace() 'ovunque nel codice per rompere in quel punto e inserire il debugger. Non devo eseguire lo script con alcun modificatore di debug speciale. –

Problemi correlati