98_fhemdebug: first version

git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@12911 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2016-12-30 12:59:07 +00:00
parent 43752621a0
commit 08c8ef5f33
4 changed files with 129 additions and 1 deletions

View File

@ -1,5 +1,6 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it. # Do not insert empty lines here, update check depends on it.
- feature: 98_fhemdebug, to aid "Error: >< no TYPE" debugging.
- feature: 70_Jabber Added possibility to change componentname via - feature: 70_Jabber Added possibility to change componentname via
attr JabberDomain attr JabberDomain
- feature: 93_DbRep: function readingRename added, delEntries is able to - feature: 93_DbRep: function readingRename added, delEntries is able to

124
FHEM/98_fhemdebug.pm Normal file
View File

@ -0,0 +1,124 @@
##############################################
# $Id$
package main;
use strict;
use warnings;
my $fhemdebug_enabled;
my $main_callfn;
sub
fhemdebug_Initialize($){
$cmds{"fhemdebug"}{Fn} = "fhemdebug_Fn";
$cmds{"fhemdebug"}{Hlp} = "{start|stop|status}";
}
sub
fhemdebug_Fn($$)
{
my ($cl,$param) = @_;
if($param eq "enable") {
return "fhemdebug is already enabled" if($fhemdebug_enabled);
local $SIG{__WARN__} = sub { };
$main_callfn = \&CallFn;
*CallFn = \&fhemdebug_CallFn;
$fhemdebug_enabled = 1;
return undef;
} elsif($param eq "disable") {
return "fhemdebug is already disabled" if(!$fhemdebug_enabled);
local $SIG{__WARN__} = sub { };
*CallFn = $main_callfn;
$fhemdebug_enabled = 0;
return undef;
} elsif($param eq "status") {
return "fhemdebug is ".($fhemdebug_enabled ? "enabled":"disabled");
} else {
return "Usage: fhemdebug {enable|disable|status}";
}
}
sub
fhemdebug_CheckDefs($@)
{
my ($txt, $dev, $n) = @_;
foreach my $d (keys %defs) {
if(!defined($d)) {
Log 1, "ERROR: undef \$defs entry found ($txt $dev $n)";
delete($defs{undef});
next;
}
if($d eq "") {
Log 1, "ERROR: '' \$defs entry found ($txt $dev $n)";
delete($defs{''});
next;
}
if(ref $defs{$d} ne "HASH") {
Log 1, "ERROR: \$defs{$d} is not a HASH ($txt $dev $n)";
delete($defs{$d});
next;
}
if(!$defs{$d}{TYPE}) {
Log 1, "ERROR: >$d< has no TYPE, but following keys: >".
join(",", sort keys %{$defs{$d}})."<".
"($txt $dev $n)";
delete($defs{$d});
next;
}
}
}
sub
fhemdebug_CallFn(@)
{
#Log 1, "fhemdebug_CallFn $_[0] $_[1];
if(wantarray) {
fhemdebug_CheckDefs("before", @_);
no strict "refs";
my @ret = &{$main_callfn}(@_);
use strict "refs";
fhemdebug_CheckDefs("after", @_);
return @ret;
} else {
fhemdebug_CheckDefs("before", @_);
no strict "refs";
my $ret = &{$main_callfn}(@_);
fhemdebug_CheckDefs("after", @_);
use strict "refs";
return $ret;
}
}
1;
=pod
=item command
=item summary try to localize FHEM error messages
=item summary_DE Hilfe bei der Lokalisierung von Fehlermeldungen
=begin html
<a name="fhemdebug"></a>
<h3>fhemdebug</h3>
<ul>
<code>fhemdebug {enable|disable|status}</code><br>
<br>
fhemdebug produces debug information in the FHEM Log to help localize
certain error messages. Currently following errors are examined:
<ul>
- Error: &gt;...&lt; has no TYPE, but following keys: &gt;...&lt;<br>
</ul>
As it frequently examines internal data-structures, it uses a lot of CPU,
it is not recommended to enable it all the time. A FHEM restart after
disabling it is not necessary.<br>
</ul>
=end html
=cut

View File

@ -388,6 +388,7 @@ FHEM/98_dewpoint.pm Joachim http://forum.fhem.de Automatis
FHEM/98_Dooya.pm Jarnsen/ralf9/darkmission http://forum.fhem.de Sonstige Systeme FHEM/98_Dooya.pm Jarnsen/ralf9/darkmission http://forum.fhem.de Sonstige Systeme
FHEM/98_dummy.pm rudolfkoenig http://forum.fhem.de Automatisierung FHEM/98_dummy.pm rudolfkoenig http://forum.fhem.de Automatisierung
FHEM/98_fheminfo.pm mfr69bs http://forum.fhem.de Sonstiges FHEM/98_fheminfo.pm mfr69bs http://forum.fhem.de Sonstiges
FHEM/98_fhemdebug.pm rudolfkoenig http://forum.fhem.de Sonstiges
FHEM/98_help.pm betateilchen http://forum.fhem.de Sonstiges FHEM/98_help.pm betateilchen http://forum.fhem.de Sonstiges
FHEM/98_HourCounter.pm john http://forum.fhem.de MAX FHEM/98_HourCounter.pm john http://forum.fhem.de MAX
FHEM/98_logProxy.pm justme1968 http://forum.fhem.de Frontends/SVG Plots logProxy FHEM/98_logProxy.pm justme1968 http://forum.fhem.de Frontends/SVG Plots logProxy

View File

@ -1025,6 +1025,7 @@ AnalyzePerlCommand($$;$)
$cmdFromAnalyze = $cmd; $cmdFromAnalyze = $cmd;
my $ret = eval $cmd; my $ret = eval $cmd;
Log 1, "ERROR evaluating $cmd: $@" if($@);
$ret = $@ if($@); $ret = $@ if($@);
$cmdFromAnalyze = undef; $cmdFromAnalyze = undef;
return $ret; return $ret;
@ -1162,6 +1163,7 @@ devspec2array($;$)
if(!$hash->{TYPE}) { if(!$hash->{TYPE}) {
Log 1, "Error: >$d< has no TYPE, but following keys: >". Log 1, "Error: >$d< has no TYPE, but following keys: >".
join(",", sort keys %{$hash})."<"; join(",", sort keys %{$hash})."<";
delete($defs{$d});
next; next;
} }
my $val; my $val;
@ -4670,7 +4672,7 @@ fhemFork()
foreach my $d (sort keys %defs) { foreach my $d (sort keys %defs) {
my $h = $defs{$d}; my $h = $defs{$d};
$h->{DBH}->{InactiveDestroy} = 1 $h->{DBH}->{InactiveDestroy} = 1
if($h->{TYPE} eq 'DbLog' && $h->{DBH}); #Forum #43271 if($h->{DBH} && $h->{TYPE} eq 'DbLog'); #Forum #43271
TcpServer_Close($h) if($h->{SERVERSOCKET}); TcpServer_Close($h) if($h->{SERVERSOCKET});
if($h->{DeviceName}) { if($h->{DeviceName}) {
require "$attr{global}{modpath}/FHEM/DevIo.pm"; require "$attr{global}{modpath}/FHEM/DevIo.pm";