[vz-dev] Segmentation Fault - vzlogger - Landis&Gyr D0

Michael Wulz michael.wulz at gmail.com
Tue Sep 2 10:53:03 CEST 2014


Hallo Reinhard,

sorry - die Mail vorhin ist hinfällig.
Da dürfte was beim Anpassen passiert sein. hab dann später erst gesehen,
dass eine Exception aufgetreten ist und der Parser schon vorher
abgebrochen hat "error:" wurde aufgerufen und der Fehler ausgegeben.

Ich habe nun neuesten git nochmal gezogen von github, deinen ersten
Vorschlag angepasst und bin schonmal etwas weiter gekommen:

root at raspberrypi:~/vzlogger# vzlogger -c /etc/vzlogger.conf
[Sep 02 08:40:27][mtr0] Creating new meter with protocol d0.
[Sep 02 08:40:27][d0]   pullseq len:5 found
[Sep 02 08:40:27][mtr0] Meter configured. enabled
[Sep 02 08:40:27]       New meter initialized (protocol=d0)
[Sep 02 08:40:27]       Configure channel.
[Sep 02 08:40:27][chn0] New channel initialized (uuid=...7ad291
protocol=volkszaehler id=1-0:1.8.1)
[Sep 02 08:40:27]       Have 1 meters.
[Sep 02 08:40:27][main] foreground=1, daemon=0, local=0
[Sep 02 08:40:27]       NOT Daemonize process...
[Sep 02 08:40:27]       Opened logfile /var/log/vzlogger.log
[Sep 02 08:40:27][]     ===> Start meters.
[Sep 02 08:40:27][mtr0] Meter connection established
[Sep 02 08:40:27][mtr0] Meter thread started
[Sep 02 08:40:27][mtr0] meter is opened. Start channels.
[Sep 02 08:40:27][chn0] Logging thread started
[Sep 02 08:40:27][]     Startup done.
[Sep 02 08:40:27][chn0] Start logging thread for volkszaehler-api.
Running as daemon: no
[Sep 02 08:40:27][mtr0] Number of readers: 32
[Sep 02 08:40:27][mtr0] Config.daemon: 0
[Sep 02 08:40:27][mtr0] Config.local: 0
[Sep 02 08:40:27][d0]   sending pullsequenz send (len:5 is:5).
[Sep 02 08:40:27][chn0] Using default api:
[Sep 02 08:40:28][d0]   Pull answer (vendor=LGZ, baudrate=5,
identification=\2ZMD3102400.B14)
[Sep 02 08:40:30][d0]   DEBUG OBIS_CODE byte  hex= 2
[Sep 02 08:40:30][d0]   DEBUG OBIS_CODE byte F hex= 46
[Sep 02 08:40:30][d0]   DEBUG OBIS_CODE byte . hex= 2E
[Sep 02 08:40:30][d0]   DEBUG OBIS_CODE byte F hex= 46
[Sep 02 08:40:30][d0]   DEBUG OBIS_CODE byte ( hex= 28
[Sep 02 08:40:30][d0]   Parsed reading (OBIS code=F.F, value=02000000,
unit=)
[Sep 02 08:40:30][d0]   DEBUG OBIS_CODE byte
 hex= A
[Sep 02 08:40:30][d0]   DEBUG OBIS_CODE byte 0 hex= 30
[Sep 02 08:40:30][d0]   DEBUG OBIS_CODE byte . hex= 2E
[Sep 02 08:40:30][d0]   DEBUG OBIS_CODE byte 0 hex= 30
[Sep 02 08:40:30][d0]   DEBUG OBIS_CODE byte . hex= 2E
[Sep 02 08:40:30][d0]   DEBUG OBIS_CODE byte 0 hex= 30
[Sep 02 08:40:30][d0]   DEBUG OBIS_CODE byte ( hex= 28
[Sep 02 08:40:31][d0]   Parsed reading (OBIS code=0.0.0, value=11111111,
unit=)
[Sep 02 08:40:31][d0]   DEBUG OBIS_CODE byte
 hex= A
[Sep 02 08:40:31][d0]   DEBUG OBIS_CODE byte 0 hex= 30
[Sep 02 08:40:31][d0]   DEBUG OBIS_CODE byte . hex= 2E
[Sep 02 08:40:31][d0]   DEBUG OBIS_CODE byte 1 hex= 31
[Sep 02 08:40:31][d0]   DEBUG OBIS_CODE byte . hex= 2E
[Sep 02 08:40:31][d0]   DEBUG OBIS_CODE byte 0 hex= 30
[Sep 02 08:40:31][d0]   DEBUG OBIS_CODE byte ( hex= 28
[Sep 02 08:40:31][d0]   Parsed reading (OBIS code=0.1.0, value=20, unit=)
[Sep 02 08:40:31][d0]   DEBUG OBIS_CODE byte


[.....]


[Sep 02 08:41:05][d0]   DEBUG OBIS_CODE byte 0 hex= 30
[Sep 02 08:41:05][d0]   DEBUG OBIS_CODE byte . hex= 2E
[Sep 02 08:41:05][d0]   DEBUG OBIS_CODE byte 2 hex= 32
[Sep 02 08:41:05][d0]   DEBUG OBIS_CODE byte . hex= 2E
[Sep 02 08:41:05][d0]   DEBUG OBIS_CODE byte 2 hex= 32
[Sep 02 08:41:05][d0]   DEBUG OBIS_CODE byte ( hex= 28
[Sep 02 08:41:05][d0]   Parsed reading (OBIS code=0.2.2, value=999, unit=)
[Sep 02 08:41:05][d0]   DEBUG OBIS_CODE byte
 hex= A
[Sep 02 08:41:05][d0]   DEBUG OBIS_CODE byte C hex= 43
[Sep 02 08:41:05][d0]   DEBUG OBIS_CODE byte . hex= 2E
[Sep 02 08:41:05][d0]   DEBUG OBIS_CODE byte 2 hex= 32
[Sep 02 08:41:05][d0]   DEBUG OBIS_CODE byte . hex= 2E
[Sep 02 08:41:05][d0]   DEBUG OBIS_CODE byte 1 hex= 31
[Sep 02 08:41:05][d0]   DEBUG OBIS_CODE byte ( hex= 28
[Sep 02 08:41:06][d0]   Parsed reading (OBIS code=C.2.1, value=00-01-01
00:00, unit=)
Segmentation fault
root at raspberrypi:~/vzlogger#


Jetzt ist ganz zum Schluss kommt ein "C.2.1"  und dann der segfault.

Die letzte Ausgabe vom Zähler sieht so aus:
[...]
2.8.1*02(000000.0)
0.9.1(21:07:42)
0.9.2(01-08-28)
0.2.0(B14)
0.2.1(TEST)
0.2.2(999)
C.2.1(00-01-01 00:00)
C.90.1(AAAAAAA)
!
9

Entweder mag er das "!" nicht oder "C.90.1" ?

was meinst du?

lg
Michael

Am 01.09.14 23:01, schrieb Reinhard Wilzeck:
> Hallo Michael,
> tatsächlich hatte ich in dem Bereich Probleme mit dem Parser.
> (Daher auch die ausführlichen log ausgaben)
> Da waren es aber der STX (hex 02) u.ä. der aber vorher abgefangen wird.
> Auch wird der Parser nur für codes gefragt die mit 1,2 oder C beginnen.
> 
> 
> 1. In diesem Fall verwirrt mich, dass der Parser noch gearbeitet hat und
> es erst beim nächsten lesen  der Fehler kommt  (vielleicht aber auch
> Zufall ,das die letzte log zeile nicht mehr ausgegeben wird).
> "
> 
> [Sep 01 12:36:16][d0]   Parsed reading (OBIS code=2.8.1*02,
> value=000000.0, unit=)
> [Sep 01 12:36:17][d0]   DEBUG OBIS_CODE byte
>  hex= A
> Segmentation fault
> 
> "
> In dem branch vzlogger-master scheint mir aber noch eine Schwäche zu sein.
> "
>             case END_LINE:
>                 if (byte == '\r' || byte == '\n') {
>                     /* free slots available and sain content? */
> *                    if ((number_of_tuples < max_readings) &&
> (strlen(obis_code) > 0) && **
> *                           *(strlen(value) > 0)*) {
>                         print(log_debug, "Parsed reading (OBIS code=%s,
> value=%s, unit=%s)", name().c_str(), obis_code, value, unit);
>                         rds[number_of_tuples].value(strtod(value, NULL));
>                     *    if
> ((obis_code[0]=='1')||(obis_code[0]=='2')||(obis_code[0]=='C')) {*
>                             /*print(log_debug, "DEBUG END_LINE Obis code
> = %s value %s ",name().c_str(), obis_code, value);*/
>                             Obis obis(obis_code);
>                             ReadingIdentifier *rid(new
> ObisIdentifier(obis));
>                             rds[number_of_tuples].identifier(rid);
>                             rds[number_of_tuples].time();
>                             byte_iterator = 0;
>                             number_of_tuples++;
>                         }
>                     }
>                     context = OBIS_CODE;
>                 }
>                 break;
> "
> Das heißt: egal wie die beiden inneren IF ausgehen: der Context wird auf
> OBIS_CODE gesetzt. Die folge ist, das wahrscheinlich der byte_iterator
> nicht auf 0 geschrieben wird. Also haben wir dort eine Überschreitung
> der Array grenzen, wenn z.B.  *number_of_tuples = max_readings* erreicht
> wird.
> Korrektur Vorschlag: 
> ...
>                     }
>                     byte_iterator = 0;
>                     context = OBIS_CODE;
>                 }
> 
> 
> 2) Zum testen mal den parser auskommentieren. Damit kannst Du
> ausschliessen, dass es der Parser ist. 
>   /*                         Obis obis(obis_code);
>                             ReadingIdentifier *rid(new
> ObisIdentifier(obis));
>                             rds[number_of_tuples].identifier(rid);
>                             rds[number_of_tuples].time();
>  */
> 
>  Gruß
>     Reinhard
> Am 01.09.2014 14:40, schrieb Michael Wulz:
>> Hallo Leute,
>>
>> mein neuer Vzlogger:
>>
>> root at raspberrypi:~# vzlogger --version
>> 0.3.6
>>
>> macht einen Segmentation Fault beim parsen der OID's.
>>
>> Meine Config:
>> {
>> "retry" : 30,                      /* how long to sleep between failed
>> requests, in seconds */
>> "daemon": false,                    /* run periodically */
>> "foreground" : true,              /* run in background */
>> "verbosity" : 9999,                   /* between 0 and 9999, je höher
>> desto mehr Infos */
>> "log" : "/var/log/vzlogger.log",   /* path to logfile, optional */
>>
>> "local" : {
>>         "enabled" : false,      /* local HTTPd for serving live
>> readings, 'false' für Daten an die middleware !!! */
>>         "port" : 80,            /* the TCP port for the local HTTPd */
>>         "index" : true,         /* should we provide a index listing of
>> available channels if no UUID was requested? */
>>         "timeout" : 30,         /* timeout for long polling comet
>> requests, 0 disables comet, in seconds */
>>         "buffer" : 600          /* how long to buffer readings for the
>> local interface, in seconds */
>>           },
>>
>> "meters" : [{                           /* Beispiel-Meter */
>>         "enabled" : true,               /* disabled meters will be
>> ignored (default) */
>>         "protocol" : "d0",              /* see 'vzlogger -h' for list of
>> available protocols */
>>         "device" : "/dev/ttyUSB0",
>>         "parity" : "7E1",               /* oder 8N1  */
>>         "baudrate" : 300,              /* oder 300  */
>>         "pullseq" : "2f3f210d0a",
>>         "interval" : 500,
>>           "interval": 6,                                   /* Wartezeit
>> in Sekunden bis neue Werte in die middleware übertragen werden */
>>            "channel": {                                   /*
>> Beispiel-channel */
>>                                  "uuid" :
>> "a02ea060-1e18-11e4-a178-5be9227ad291",
>>                                  "middleware" :
>> "http://127.0.0.1/middleware.php",
>>                                  "identifier" : "1-0:1.8.1" /* alias for
>> '1-0:1.8.1', see 'vzlogger -h' for list of available aliases */
>>                               }
>>                    }]
>> }
>>
>> der Output vom vzlogger:
>> [Sep 01 12:35:41][mtr0] Creating new meter with protocol d0.
>> [Sep 01 12:35:41][d0]   pullseq len:5 found
>> [Sep 01 12:35:41][mtr0] Meter configured. enabled
>> [Sep 01 12:35:41]       New meter initialized (protocol=d0)
>> [Sep 01 12:35:41]       Configure channel.
>> [Sep 01 12:35:41][chn0] New channel initialized (uuid=...7ad291
>> protocol=volkszaehler id=1-0:1.8.1)
>> [Sep 01 12:35:41]       Have 1 meters.
>> [Sep 01 12:35:41][main] foreground=1, daemon=0, local=0
>> [Sep 01 12:35:41]       NOT Daemonize process...
>> [Sep 01 12:35:41]       Opened logfile /var/log/vzlogger.log
>> [Sep 01 12:35:41][]     ===> Start meters.
>> [Sep 01 12:35:41][mtr0] Meter connection established
>> [Sep 01 12:35:41][mtr0] Meter thread started
>> [Sep 01 12:35:41][mtr0] meter is opened. Start channels.
>> [Sep 01 12:35:41][chn0] Logging thread started
>> [Sep 01 12:35:41][]     Startup done.
>> [Sep 01 12:35:41][chn0] Start logging thread for volkszaehler-api.
>> Running as daemon: no
>> [Sep 01 12:35:41][chn0] Using default api:
>> [Sep 01 12:35:41][mtr0] Number of readers: 32
>> [Sep 01 12:35:41][mtr0] Config.daemon: 0
>> [Sep 01 12:35:41][mtr0] Config.local: 0
>> [Sep 01 12:35:41][d0]   sending pullsequenz send (len:5 is:5).
>> [Sep 01 12:35:42][d0]   Pull answer (vendor=LGZ, baudrate=5,
>> identification=\2ZMD3102400.B14)
>> [Sep 01 12:35:44][d0]   DEBUG OBIS_CODE byte ^B hex= 2
>> [Sep 01 12:35:44][d0]   DEBUG OBIS_CODE byte F hex= 46
>> [Sep 01 12:35:44][d0]   DEBUG OBIS_CODE byte . hex= 2E
>> [Sep 01 12:35:44][d0]   DEBUG OBIS_CODE byte F hex= 46
>> [Sep 01 12:35:44][d0]   DEBUG OBIS_CODE byte ( hex= 28
>> [Sep 01 12:35:44][d0]   Parsed reading (OBIS code=F.F, value=02000000,
>> unit=)
>> [Sep 01 12:35:44][d0]   DEBUG OBIS_CODE byte
>>  hex= A
>> [Sep 01 12:35:44][d0]   DEBUG OBIS_CODE byte 0 hex= 30
>> [Sep 01 12:35:44][d0]   DEBUG OBIS_CODE byte . hex= 2E
>> [Sep 01 12:35:44][d0]   DEBUG OBIS_CODE byte 0 hex= 30
>> [Sep 01 12:35:44][d0]   DEBUG OBIS_CODE byte . hex= 2E
>> [Sep 01 12:35:44][d0]   DEBUG OBIS_CODE byte 0 hex= 30
>> [Sep 01 12:35:44][d0]   DEBUG OBIS_CODE byte ( hex= 28
>> [Sep 01 12:35:45][d0]   Parsed reading (OBIS code=0.0.0, value=11111111,
>> unit=)
>> [Sep 01 12:35:45][d0]   DEBUG OBIS_CODE byte
>>  hex= A
>>
>> [....]
>>
>> [Sep 01 12:36:14][d0]   DEBUG OBIS_CODE byte 2 hex= 32
>> [Sep 01 12:36:15][d0]   DEBUG OBIS_CODE byte . hex= 2E
>> [Sep 01 12:36:15][d0]   DEBUG OBIS_CODE byte 8 hex= 38
>> [Sep 01 12:36:15][d0]   DEBUG OBIS_CODE byte . hex= 2E
>> [Sep 01 12:36:15][d0]   DEBUG OBIS_CODE byte 1 hex= 31
>> [Sep 01 12:36:15][d0]   DEBUG OBIS_CODE byte * hex= 2A
>> [Sep 01 12:36:15][d0]   DEBUG OBIS_CODE byte 1 hex= 31
>> [Sep 01 12:36:15][d0]   DEBUG OBIS_CODE byte 0 hex= 30
>> [Sep 01 12:36:15][d0]   DEBUG OBIS_CODE byte ( hex= 28
>> [Sep 01 12:36:15][d0]   Parsed reading (OBIS code=2.8.1*10,
>> value=000000.0, unit=)
>> [Sep 01 12:36:15][d0]   DEBUG OBIS_CODE byte
>>  hex= A
>> [Sep 01 12:36:15][d0]   DEBUG OBIS_CODE byte 2 hex= 32
>> [Sep 01 12:36:15][d0]   DEBUG OBIS_CODE byte . hex= 2E
>> [Sep 01 12:36:15][d0]   DEBUG OBIS_CODE byte 8 hex= 38
>> [Sep 01 12:36:15][d0]   DEBUG OBIS_CODE byte . hex= 2E
>> [Sep 01 12:36:15][d0]   DEBUG OBIS_CODE byte 1 hex= 31
>> [Sep 01 12:36:15][d0]   DEBUG OBIS_CODE byte * hex= 2A
>> [Sep 01 12:36:15][d0]   DEBUG OBIS_CODE byte 0 hex= 30
>> [Sep 01 12:36:15][d0]   DEBUG OBIS_CODE byte 9 hex= 39
>> [Sep 01 12:36:15][d0]   DEBUG OBIS_CODE byte ( hex= 28
>> [Sep 01 12:36:16][d0]   Parsed reading (OBIS code=2.8.1*09,
>> value=000000.0, unit=)
>> [Sep 01 12:36:16][d0]   DEBUG OBIS_CODE byte
>>  hex= A
>> [Sep 01 12:36:16][d0]   DEBUG OBIS_CODE byte 2 hex= 32
>> [Sep 01 12:36:16][d0]   DEBUG OBIS_CODE byte . hex= 2E
>> [Sep 01 12:36:16][d0]   DEBUG OBIS_CODE byte 8 hex= 38
>> [Sep 01 12:36:16][d0]   DEBUG OBIS_CODE byte . hex= 2E
>> [Sep 01 12:36:16][d0]   DEBUG OBIS_CODE byte 1 hex= 31
>> [Sep 01 12:36:16][d0]   DEBUG OBIS_CODE byte * hex= 2A
>> [Sep 01 12:36:16][d0]   DEBUG OBIS_CODE byte 0 hex= 30
>> [Sep 01 12:36:16][d0]   DEBUG OBIS_CODE byte 2 hex= 32
>> [Sep 01 12:36:16][d0]   DEBUG OBIS_CODE byte ( hex= 28
>> [Sep 01 12:36:16][d0]   Parsed reading (OBIS code=2.8.1*02,
>> value=000000.0, unit=)
>> [Sep 01 12:36:17][d0]   DEBUG OBIS_CODE byte
>>  hex= A
>> Segmentation fault
>>
>> Es scheint der Zähler nach dem Obis CODE: 2.8.1*02 irgendein Zeichen zu
>> senden, dass den Parser abstürzen lässt.
>>
>> Hat jemand von euch das Problem auch schonmal gehabt?
>>
>> danke
>> Michael
>>
> 
> 



More information about the volkszaehler-dev mailing list