98_fhemdebug.pm 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. ##############################################
  2. # $Id: 98_fhemdebug.pm 12911 2016-12-30 12:59:07Z rudolfkoenig $
  3. package main;
  4. use strict;
  5. use warnings;
  6. my $fhemdebug_enabled;
  7. my $main_callfn;
  8. sub
  9. fhemdebug_Initialize($){
  10. $cmds{"fhemdebug"}{Fn} = "fhemdebug_Fn";
  11. $cmds{"fhemdebug"}{Hlp} = "{start|stop|status}";
  12. }
  13. sub
  14. fhemdebug_Fn($$)
  15. {
  16. my ($cl,$param) = @_;
  17. if($param eq "enable") {
  18. return "fhemdebug is already enabled" if($fhemdebug_enabled);
  19. local $SIG{__WARN__} = sub { };
  20. $main_callfn = \&CallFn;
  21. *CallFn = \&fhemdebug_CallFn;
  22. $fhemdebug_enabled = 1;
  23. return undef;
  24. } elsif($param eq "disable") {
  25. return "fhemdebug is already disabled" if(!$fhemdebug_enabled);
  26. local $SIG{__WARN__} = sub { };
  27. *CallFn = $main_callfn;
  28. $fhemdebug_enabled = 0;
  29. return undef;
  30. } elsif($param eq "status") {
  31. return "fhemdebug is ".($fhemdebug_enabled ? "enabled":"disabled");
  32. } else {
  33. return "Usage: fhemdebug {enable|disable|status}";
  34. }
  35. }
  36. sub
  37. fhemdebug_CheckDefs($@)
  38. {
  39. my ($txt, $dev, $n) = @_;
  40. foreach my $d (keys %defs) {
  41. if(!defined($d)) {
  42. Log 1, "ERROR: undef \$defs entry found ($txt $dev $n)";
  43. delete($defs{undef});
  44. next;
  45. }
  46. if($d eq "") {
  47. Log 1, "ERROR: '' \$defs entry found ($txt $dev $n)";
  48. delete($defs{''});
  49. next;
  50. }
  51. if(ref $defs{$d} ne "HASH") {
  52. Log 1, "ERROR: \$defs{$d} is not a HASH ($txt $dev $n)";
  53. delete($defs{$d});
  54. next;
  55. }
  56. if(!$defs{$d}{TYPE}) {
  57. Log 1, "ERROR: >$d< has no TYPE, but following keys: >".
  58. join(",", sort keys %{$defs{$d}})."<".
  59. "($txt $dev $n)";
  60. delete($defs{$d});
  61. next;
  62. }
  63. }
  64. }
  65. sub
  66. fhemdebug_CallFn(@)
  67. {
  68. #Log 1, "fhemdebug_CallFn $_[0] $_[1];
  69. if(wantarray) {
  70. fhemdebug_CheckDefs("before", @_);
  71. no strict "refs";
  72. my @ret = &{$main_callfn}(@_);
  73. use strict "refs";
  74. fhemdebug_CheckDefs("after", @_);
  75. return @ret;
  76. } else {
  77. fhemdebug_CheckDefs("before", @_);
  78. no strict "refs";
  79. my $ret = &{$main_callfn}(@_);
  80. fhemdebug_CheckDefs("after", @_);
  81. use strict "refs";
  82. return $ret;
  83. }
  84. }
  85. 1;
  86. =pod
  87. =item command
  88. =item summary try to localize FHEM error messages
  89. =item summary_DE Hilfe bei der Lokalisierung von Fehlermeldungen
  90. =begin html
  91. <a name="fhemdebug"></a>
  92. <h3>fhemdebug</h3>
  93. <ul>
  94. <code>fhemdebug {enable|disable|status}</code><br>
  95. <br>
  96. fhemdebug produces debug information in the FHEM Log to help localize
  97. certain error messages. Currently following errors are examined:
  98. <ul>
  99. - Error: &gt;...&lt; has no TYPE, but following keys: &gt;...&lt;<br>
  100. </ul>
  101. As it frequently examines internal data-structures, it uses a lot of CPU,
  102. it is not recommended to enable it all the time. A FHEM restart after
  103. disabling it is not necessary.<br>
  104. </ul>
  105. =end html
  106. =cut