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

Michael Wulz michael.wulz at gmail.com
Tue Sep 2 11:17:41 CEST 2014


Hallo,

so bin schon wieder...

Ich hab eine Lösung für mein Problem gefunden:

aus der IF hab ich ||(obis_code[0]=='C') rausgenommen.

die OBIS Codes mit C-beginnend interessieren mich in diesem Falle nicht.
Nun parst er auch die C.xxx.xxx Werte nicht und läuft in meinem Falle
nun auch brav!

Die Frage ist, ob evenutell der Parser selber angepasst werden kann
sodass er auch:

OBIS code=C.2.1, value=00-01-01 00:00
OBIS code=C.90.1, value=AAAAAAA

verarbeiten kann, denke nämlich dass er hier bei einen von den beiden
hängen segfaulted.

grüße
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