Debug Informationen über PRINT Ausgeben

Begonnen von gehrmr, 10 November 2013, 12:22:16

Vorheriges Thema - Nächstes Thema

gehrmr

Hallo,
gibt es eine Möglichkeit, Parameter auszudrucken z.B. über eine Print Anweisung (als Debug Funktion)?
Ich habe die Funktion print "xxx" innerhalb eines Perl Moduls eingesetzt, testweise auch im CFG File, aber ich bekomme keine Ausgabe (Telnet/Web)?
Frage: wie bekomme ich es hin, bestimmte Parameter, Ergebnisse ... während des laufenden Betriebs mir anzuschauen.
Ich benutze FHEM Version 5.4. auf einem Raspberry.
Vielen Dank für einen guten Tip!


Dirk

Hallo gehrmr,

ich benutze immer
print Dumper($variable);

Dazu musst du aber Data::Dumper in dein Modul einbinden
use Data::Dumper;

Damit lassen sich auch Arrays und Hashes Ausgeben.
Das landet dann aber nicht im Log, sondern auf der Console.

Am besten du startest dafür FHEM während der Entwicklung ohne Logfile.
attr global logfile -

Damit bleibt es im Vordergrund und die Logausgaben und die Debugausgaben landen in der aktuellen Console.

Gruß
Dirk

Dietmar63

ich mache immer folgendes:

Auszug aus meiner startfhem:

# ==============================================================================
date="`date +"%d.%m.%Y %H:%M:%S %a"`"

jahr=${date:06:04}
mon=${date:03:02}

tag=${date:0:02}

hour=${date:11:02}
min=${date:14:02}

sec=${date:17:02}
################################################################################
#set -x
ps >/tmp/test
################################################################################
grep "perl fhem.pl fhem.cfg" /tmp/test >/dev/null
if [ $? == 0 ]
then
    echo "fhem bereits gestartet"
else
    # fhem starten
    echo "fhem$jahr$mon$tag-$hour$min$sec.log" >$home/log/log
    perl fhem.pl fhem.cfg >"$home/log/fhem$jahr$mon$tag-$hour$min$sec.log" 2>&1 &
fi


so gehen bei mir keine Ausgaben der Console verloren. Vielleicht wäre das sogar was fürs Release. Ich weiss nicht, wer dafür verantwortlich wäre, es ins SVN aufzunehmen. Dann muss man fhem nicht immer neu starten.

Es geht übrigens auf folgendes:

    my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
    my $ts =  sprintf ("%04d-%02d-%02d_%02d:%02d:%02d\n",$year+1900,$mon+1,$mday,$hour,$min,$sec);
    print STDERR $ts;

Dann wird der Text immer auf der Console ausgegeben - manchmal sinnvoll.

Ich gebe alle drei Stunden den Zeitstempel so aus. Dann kann ich immer sagen, ob Fehler der Console aus aktuellen Veränderungen stammen.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

justme1968

ich habe mein fhem start script so geändert das es stdout und stderr jeweil in ein eigenes log file umleitet:${perl_BIN} $fhem_BIN $fhem_CONFIG >> ${HOME}/var/log/fhem-stdout 2>>${HOME}/var/log/fhem-stderrdas mit dem zeitstempel ist eine klasse idee. das klaue ich mir :)

im code selber verwende ich zum debuggein einfach Log. damit landet alles im normalen fhem log file und alles ist beieinander.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Dietmar63

du scheinst ja plan von linux zu haben  - warum klappt folgendes nicht:
top -d 60 | grep ^CPU: >> /var/InternerSpeicher/USBDISK2-0-01/fhem/log/top.log &
Hintergrund: habe manchmal Performanceprobleme auf der FB. Irgendwie schaukelt sich die Last hoch, so dass nichts mehr geht. Ein restart von fhem löst das Problm meist.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

justme1968

was genau möchtest du denn machen bzw. damit rausfinden? ich vermute mal jede minute die prozesse mt der höchsten cpu last?

ich weiss nicht genau was ein top auf der fritzbox ausspuckt. aber das geht so aus mehreren gründen nicht:

- wenn du top so startest ist es für eine 'interaktive' ansicht gedacht. der bildschirm wird jede minute neu gezeichnet. inklusive steuerlichen die den cursor bewegen um an eine bestimmte stelle zu kommen. deine daten sind im prinzip ein endloser strom und du kannst mit grep nur bestimmte zeilen extrahieren deren werte du kennst.

- du machst ein grep auf das wort cpu am zeilen anfang. ich vermute das kommt gar nicht vor.

du kannst aber stat dessen top im batch mode verwenden und es nur ein mal laufen lassen. davon dann die ersten x zeilen und davon dann den wiederum den headeder abschneiden. also etwas so: top -b -n 1 | head -10 | tail -3das dann in ein file umleiten und z.b. per cron regelmäßig ausführen. zur not geht das auch ohne -b wenn dein top das nicht kann. wenn dein top dasn '-n 1' für nur ein mal laufen nicht kann geht es so aber gar nicht.

gruss
  andre

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Dietmar63

Danke für die Antwort.
Die box hat auch etwas davon gefaselt wie:  tty, stopped
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

justme1968

das kann eben genau deshalb sein weil die ausgabe nicht mehr ein terminal ist und alles was mit cursor bewegungen zu tun hat nicht mehr sinnvoll ist.

da gibt es zwar auch wieder workarounds aber es passt eigentlich alles nicht wirklich so lange das top einfach kontinuierlich daten produziert statt nur genau ein mal zu laufen.

je nach dem welche ps version installiert ist geht es eventuell auch damit:ps axo %cpu,args | sort -n

 

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

deinmedium

Hallo,

ich bin ein schlimmer Anfänger und werde hoffentlich nicht gleich geköpft?!

Könnt ihr mir sagen wie es aussehen wenn ich im Frontend ein Variable auslesen möchte?

Ich denke so in der Art sollte das sein ober es klappt nicht.

{print $tempm}

Würdet ihr mir dabei bitte helfen?  DANKE