2016-01-22 17 views
17

Szukam narzędzia wiersza polecenia, które będzie co najmniej renderować dane binarne protobuf w postaci czytelnej dla człowieka. Opcje filtrowania i selekcji (zgodnie z linią cut dla tekstu) byłyby miłe, ale głównym celem jest uczynienie danych widocznymi do celów debugowania.Czy istnieje narzędzie wiersza polecenia * nix do sprawdzania buforów protokołów?

Jeśli nie ma odpowiedniego narzędzia do pracy, linki do odpowiednich pakietów są w porządku.

+1

Wystarczy popatrzeć na komendzie protoc zbudowany do buforów protokołów , ma opcje dekodowania (--decode) binarnych wiadomości do tekstu (i konwertowania go za pomocą --encode opcja; prawdopodobnie nie będzie działać dla wiadomości rozdzielanych javą. Istnieją narzędzia do konwersji pb do Xml/JSon. Jeśli używasz <= 2.6.1, jest https://sourceforge.net/projects/protobufeditor/ –

+0

Dzięki, dam ci to zobaczyć. – comingstorm

+0

Takie narzędzie może [konwertować bufory protokołu do JSON] (https://stackoverflow.com/questions/2544580/is-there-a-standard-mapping-between-json-and-protocol-buffers). – Raedwald

Odpowiedz

21

Kompilator protokołów - protoc - ma wbudowaną tę funkcję za pośrednictwem flag --decode i --decode_raw. To jest to samo narzędzie, które służy do generowania kodu z pliku .proto, więc prawdopodobnie jest już zainstalowany.

Na przykład:

protoc --decode_raw < message.bin 

lub za pomocą pliku .proto:

protoc --decode mypkg.MyType myschema.proto < message.bin 

Oto --help tekst:

Usage: protoc [OPTION] PROTO_FILES 
Parse PROTO_FILES and generate output based on the options given: 
    -IPATH, --proto_path=PATH Specify the directory in which to search for 
           imports. May be specified multiple times; 
           directories will be searched in order. If not 
           given, the current working directory is used. 
    --version     Show version info and exit. 
    -h, --help     Show this text and exit. 
    --encode=MESSAGE_TYPE  Read a text-format message of the given type 
           from standard input and write it in binary 
           to standard output. The message type must 
           be defined in PROTO_FILES or their imports. 
    --decode=MESSAGE_TYPE  Read a binary message of the given type from 
           standard input and write it in text format 
           to standard output. The message type must 
           be defined in PROTO_FILES or their imports. 
    --decode_raw    Read an arbitrary protocol message from 
           standard input and write the raw tag/value 
           pairs in text format to standard output. No 
           PROTO_FILES should be given when using this 
           flag. 
    -oFILE,      Writes a FileDescriptorSet (a protocol buffer, 
    --descriptor_set_out=FILE defined in descriptor.proto) containing all of 
           the input files to FILE. 
    --include_imports   When using --descriptor_set_out, also include 
           all dependencies of the input files in the 
           set, so that the set is self-contained. 
    --include_source_info  When using --descriptor_set_out, do not strip 
           SourceCodeInfo from the FileDescriptorProto. 
           This results in vastly larger descriptors that 
           include information about the original 
           location of each decl in the source file as 
           well as surrounding comments. 
    --error_format=FORMAT  Set the format in which to print errors. 
           FORMAT may be 'gcc' (the default) or 'msvs' 
           (Microsoft Visual Studio format). 
    --print_free_field_numbers Print the free field numbers of the messages 
           defined in the given proto files. Groups share 
           the same field number space with the parent 
           message. Extension ranges are counted as 
           occupied fields numbers. 
    --plugin=EXECUTABLE   Specifies a plugin executable to use. 
           Normally, protoc searches the PATH for 
           plugins, but you may specify additional 
           executables not in the path using this flag. 
           Additionally, EXECUTABLE may be of the form 
           NAME=PATH, in which case the given plugin name 
           is mapped to the given executable even if 
           the executable's own name differs. 
    --cpp_out=OUT_DIR   Generate C++ header and source. 
    --java_out=OUT_DIR   Generate Java source file. 
    --python_out=OUT_DIR  Generate Python source file. 
+2

Cały czas pod nosem. Dzięki za napisanie, mam nadzieję, że pomoże to również innym. – comingstorm

+0

Czy istnieją jakieś obejścia/opcje, aby użyć interfejsu CLI/narzędzia do komunikatów rozdzielanych przy użyciu parsowania (Java), za każdym razem? –

+0

@decimusphostle Niestety, nie sądzę. Obsługa rozgraniczonych wiadomości dopiero niedawno trafiła do biblioteki C++ po długim okresie przeciągania przez opiekunów. Prawdopodobnie ktoś będzie musiał wysłać mu PR, aby dodać obsługę linii poleceń. –