OK, tracked it down to grpc-1.0.0/include/grpc++/impl/codegen/completion_queue_tag.h -- the pure virtual function "bool FinalizeResult()" -- what do I need to do to initialize it that I'm not doing in the program above? (As a hack, I just had it print a message to stdout and return "false", now the program doesn't give the "pure virtual method" error, but obviously isn't working completely as intended)
On Wednesday, November 16, 2016 at 9:12:43 AM UTC-5, [email protected] wrote: > > Sadly, I'm still stuck. I don't know enough C++ to be able to diagnose > this further... :-( > > On Tuesday, November 15, 2016 at 2:01:50 PM UTC-5, [email protected] wrote: >> >> Ok: >> >> *(gdb) handle SIG36 noprint* >> *Signal Stop Print Pass to program Description* >> *SIG36 No No Yes Real-time event 36* >> *(gdb) run* >> *Starting program: /.../minfail* >> *[Thread debugging using libthread_db enabled]* >> *D1115 13:59:40.187940393 34391 env_linux.c:77] Warning: >> insecure environment read function 'getenv' used* >> *[New Thread 0x7ffff6fcc700 (LWP 34394)]* >> *[New Thread 0x7ffff65cb700 (LWP 34395)]* >> *[New Thread 0x7ffff5bca700 (LWP 34396)]* >> *[New Thread 0x7ffff51c9700 (LWP 34397)]* >> *[New Thread 0x7ffff47c8700 (LWP 34398)]* >> *[New Thread 0x7ffff3dc7700 (LWP 34399)]* >> *[New Thread 0x7ffff33c6700 (LWP 34400)]* >> *[New Thread 0x7ffff29c5700 (LWP 34401)]* >> *[New Thread 0x7ffff1fc4700 (LWP 34402)]* >> *[New Thread 0x7ffff15c3700 (LWP 34403)]* >> *[New Thread 0x7ffff0bc2700 (LWP 34404)]* >> *[New Thread 0x7ffff01c1700 (LWP 34405)]* >> *[New Thread 0x7fffef7c0700 (LWP 34406)]* >> *[New Thread 0x7fffeedbf700 (LWP 34407)]* >> *[New Thread 0x7fffee3be700 (LWP 34408)]* >> *[New Thread 0x7fffed9bd700 (LWP 34409)]* >> *pure virtual method called* >> *terminate called without an active exception* >> >> *Program received signal SIGABRT, Aborted.* >> *0x00000035ce0325e5 in raise () from /lib64/libc.so.6* >> *(gdb) bt* >> *#0 0x00000035ce0325e5 in raise () from /lib64/libc.so.6* >> *#1 0x00000035ce033dc5 in abort () from /lib64/libc.so.6* >> *#2 0x00000035d4cbea7d in __gnu_cxx::__verbose_terminate_handler() () >> from /usr/lib64/libstdc++.so.6* >> *#3 0x00000035d4cbcbd6 in ?? () from /usr/lib64/libstdc++.so.6* >> *#4 0x00000035d4cbcc03 in std::terminate() () from >> /usr/lib64/libstdc++.so.6* >> *#5 0x00000035d4cbd55f in __cxa_pure_virtual () from >> /usr/lib64/libstdc++.so.6* >> *#6 0x00007ffff76e3f7a in >> grpc::CompletionQueue::AsyncNextInternal(void**, bool*, gpr_timespec) () >> from /.../lib/libgrpc++.so.1* >> *#7 0x000000000040919f in grpc::CompletionQueue::Next >> [_ZN4grpc15Completion...] (this=0x628fa0, tag=0x7fffffffe1e8, >> ok=0x7fffffffe1e7) at >> .../include/grpc++/impl/codegen/completion_queue.h:148* >> *#8 0x00000000004085ca in main [main] (argc=1, argv=0x7fffffffe3a8) at >> minfail.cc:95* >> *(gdb)* >> >> >> On Tuesday, November 15, 2016 at 1:55:48 PM UTC-5, Craig Tiller wrote: >>> >>> You probably want to first do 'handle SIG36 noprint' to let gdb pass the >>> (totally legitimate) signal to the application. >>> >>> On Tue, Nov 15, 2016 at 8:56 AM <[email protected]> wrote: >>> >>>> >>>> Hi all, >>>> >>>> I've created a tiny code sample that is based off the hello world async >>>> greeter example. I keep getting a "pure virtual method called" in the >>>> grpc_completion_queue_next() function, and I'm having a hard time >>>> understanding why. What am I doing wrong? >>>> >>>> I've included the proto file, C++ code and gdb output... (the program >>>> is both a client or a server, if you give it a command line value of "c" >>>> it >>>> acts as a client). >>>> >>>> Thanks in advance! >>>> >>>> PROTO FILE >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> *syntax = "proto3";package helloworld;service Greeter{ rpc SayHello >>>> (HelloRequest) returns (stream HelloReply) {}}message HelloRequest{ >>>> string message = 1;}message HelloReply{ string reply = 1;}* >>>> >>>> >>>> C++ CODE >>>> >>>> *#include <iostream>* >>>> *#include <string>* >>>> *#include <grpc++/grpc++.h>* >>>> *#include "minfail.grpc.pb.h"* >>>> >>>> *using namespace std;* >>>> *using namespace helloworld;* >>>> >>>> *class CallData {* >>>> *public:* >>>> * CallData(Greeter::AsyncService* service, >>>> grpc::ServerCompletionQueue* cq) : service_(service), cq_(cq), >>>> responder_(&ctx_), status_(CREATE) {* >>>> * Proceed();* >>>> * }* >>>> >>>> * void Proceed() {* >>>> * if (status_ == CREATE) {* >>>> * status_ = PROCESS;* >>>> * service_->RequestSayHello(&ctx_, &request_, &responder_, >>>> cq_, cq_, this);* >>>> * } else if (status_ == PROCESS) {* >>>> * new CallData(service_, cq_);* >>>> * reply_.set_reply("hello " + request_.message());* >>>> * responder_.Write (reply_, this);* >>>> * responder_.Finish(grpc::Status::OK, this);* >>>> * status_ = FINISH;* >>>> * } else {* >>>> * GPR_ASSERT(status_ == FINISH);* >>>> * delete this;* >>>> * }* >>>> * }* >>>> >>>> *private:* >>>> * HelloRequest request_;* >>>> * HelloReply reply_;* >>>> * grpc::ServerAsyncWriter<HelloReply> responder_;* >>>> >>>> * enum CallStatus { CREATE, PROCESS, FINISH };* >>>> * CallStatus status_;* >>>> * grpc::ServerContext ctx_;* >>>> * grpc::ServerCompletionQueue* cq_;* >>>> * Greeter::AsyncService* service_;* >>>> *};* >>>> >>>> *class GreeterClient* >>>> *{* >>>> *public:* >>>> * GreeterClient (shared_ptr <grpc::Channel> channel)* >>>> * : stub_ (Greeter::NewStub (channel)) {}* >>>> * string* >>>> * SayHello (const string &user) {* >>>> * HelloRequest request;* >>>> * request.set_message (user);* >>>> * grpc::ClientContext context;* >>>> * unique_ptr <grpc::ClientReader <HelloReply>> reader >>>> (stub_->SayHello (&context, request));* >>>> * HelloReply reply;* >>>> * while (reader -> Read (&reply)) {* >>>> * cout << "SayHello returns " << reply.reply() << "\n";* >>>> * }* >>>> * grpc::Status status = reader -> Finish();* >>>> * if (status.ok()) {* >>>> * return (reply.reply());* >>>> * }* >>>> * return ("<RPC failed>");* >>>> * }* >>>> >>>> *private:* >>>> * unique_ptr<Greeter::Stub> stub_;* >>>> *};* >>>> >>>> *int* >>>> *main (int argc, char **argv)* >>>> *{* >>>> * string server_address ("0.0.0.0:50051 <http://0.0.0.0:50051>");* >>>> >>>> * if (argc == 2 && argv [1][0] == 'c') {* >>>> * GreeterClient greeter(grpc::CreateChannel (server_address, >>>> grpc::InsecureChannelCredentials()));* >>>> * cout << "Sending world...\n";* >>>> * cout << "Response is " << greeter.SayHello ("world") << "\n";* >>>> * } else {* >>>> * unique_ptr<grpc::ServerCompletionQueue> cq;* >>>> * Greeter::AsyncService service;* >>>> * unique_ptr<grpc::Server> server;* >>>> >>>> * grpc::ServerBuilder builder;* >>>> >>>> * builder.AddListeningPort(server_address, >>>> grpc::InsecureServerCredentials());* >>>> * builder.RegisterService(&service);* >>>> * cq = builder.AddCompletionQueue();* >>>> * server = builder.BuildAndStart();* >>>> >>>> * new CallData(&service, cq.get());* >>>> * CallData* tag; // uniquely identifies a request.* >>>> * bool ok;* >>>> * while (true) {* >>>> * GPR_ASSERT(cq->Next((void **)&tag, &ok));* >>>> * GPR_ASSERT(ok);* >>>> * tag->Proceed();* >>>> * }* >>>> >>>> * server->Shutdown();* >>>> * cq->Shutdown();* >>>> * }* >>>> *}* >>>> >>>> and run / GDB output: >>>> >>>> >>>> >>>> >>>> >>>> *$ ./minfailD1115 11:45:47.919769500 24264 >>>> env_linux.c:77] Warning: insecure environment read function >>>> 'getenv' usedpure virtual method calledterminate called without an active >>>> exceptionAborted (core dumped)* >>>> >>>> *$ gdb ./minfail* >>>> *... elided ...* >>>> *Program received signal SIG36, Real-time event 36.* >>>> *0x00000035ce0e8cec in epoll_pwait () from /lib64/libc.so.6* >>>> *(gdb) bt* >>>> *#0 0x00000035ce0e8cec in epoll_pwait () from /lib64/libc.so.6* >>>> *#1 0x00007ffff76f8d4a in ?? () from /.../lib/libgrpc++.so.1* >>>> *#2 0x00007ffff76f91a6 in ?? () from /.../lib/libgrpc++.so.1* >>>> *#3 0x00007ffff770d61b in grpc_completion_queue_next () from >>>> /.../lib/libgrpc++.so.1* >>>> *#4 0x00007ffff76e3f20 in >>>> grpc::CompletionQueue::AsyncNextInternal(void**, bool*, gpr_timespec) () >>>> from /.../lib/libgrpc++.so.1* >>>> *#5 0x000000000040919f in grpc::CompletionQueue::Next >>>> [_ZN4grpc15Completion...] (this=0x628fa0, tag=0x7fffffffe1e8, >>>> ok=0x7fffffffe1e7) at >>>> .../include/grpc++/impl/codegen/completion_queue.h:148* >>>> *#6 0x00000000004085ca in main [main] (argc=1, argv=0x7fffffffe3a8) at >>>> minfail.cc:95* >>>> *(gdb)* >>>> >>>> Any help greatly appreciated! >>>> >>>> Cheers, >>>> -RK >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "grpc.io" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> To post to this group, send email to [email protected]. >>>> Visit this group at https://groups.google.com/group/grpc-io. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/grpc-io/34f059a0-f825-4aa3-a725-84fb61e46b1f%40googlegroups.com >>>> >>>> <https://groups.google.com/d/msgid/grpc-io/34f059a0-f825-4aa3-a725-84fb61e46b1f%40googlegroups.com?utm_medium=email&utm_source=footer> >>>> . >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> On Wednesday, November 16, 2016 at 9:12:43 AM UTC-5, [email protected] wrote: > > Sadly, I'm still stuck. I don't know enough C++ to be able to diagnose > this further... :-( > > On Tuesday, November 15, 2016 at 2:01:50 PM UTC-5, [email protected] wrote: >> >> Ok: >> >> *(gdb) handle SIG36 noprint* >> *Signal Stop Print Pass to program Description* >> *SIG36 No No Yes Real-time event 36* >> *(gdb) run* >> *Starting program: /.../minfail* >> *[Thread debugging using libthread_db enabled]* >> *D1115 13:59:40.187940393 34391 env_linux.c:77] Warning: >> insecure environment read function 'getenv' used* >> *[New Thread 0x7ffff6fcc700 (LWP 34394)]* >> *[New Thread 0x7ffff65cb700 (LWP 34395)]* >> *[New Thread 0x7ffff5bca700 (LWP 34396)]* >> *[New Thread 0x7ffff51c9700 (LWP 34397)]* >> *[New Thread 0x7ffff47c8700 (LWP 34398)]* >> *[New Thread 0x7ffff3dc7700 (LWP 34399)]* >> *[New Thread 0x7ffff33c6700 (LWP 34400)]* >> *[New Thread 0x7ffff29c5700 (LWP 34401)]* >> *[New Thread 0x7ffff1fc4700 (LWP 34402)]* >> *[New Thread 0x7ffff15c3700 (LWP 34403)]* >> *[New Thread 0x7ffff0bc2700 (LWP 34404)]* >> *[New Thread 0x7ffff01c1700 (LWP 34405)]* >> *[New Thread 0x7fffef7c0700 (LWP 34406)]* >> *[New Thread 0x7fffeedbf700 (LWP 34407)]* >> *[New Thread 0x7fffee3be700 (LWP 34408)]* >> *[New Thread 0x7fffed9bd700 (LWP 34409)]* >> *pure virtual method called* >> *terminate called without an active exception* >> >> *Program received signal SIGABRT, Aborted.* >> *0x00000035ce0325e5 in raise () from /lib64/libc.so.6* >> *(gdb) bt* >> *#0 0x00000035ce0325e5 in raise () from /lib64/libc.so.6* >> *#1 0x00000035ce033dc5 in abort () from /lib64/libc.so.6* >> *#2 0x00000035d4cbea7d in __gnu_cxx::__verbose_terminate_handler() () >> from /usr/lib64/libstdc++.so.6* >> *#3 0x00000035d4cbcbd6 in ?? () from /usr/lib64/libstdc++.so.6* >> *#4 0x00000035d4cbcc03 in std::terminate() () from >> /usr/lib64/libstdc++.so.6* >> *#5 0x00000035d4cbd55f in __cxa_pure_virtual () from >> /usr/lib64/libstdc++.so.6* >> *#6 0x00007ffff76e3f7a in >> grpc::CompletionQueue::AsyncNextInternal(void**, bool*, gpr_timespec) () >> from /.../lib/libgrpc++.so.1* >> *#7 0x000000000040919f in grpc::CompletionQueue::Next >> [_ZN4grpc15Completion...] (this=0x628fa0, tag=0x7fffffffe1e8, >> ok=0x7fffffffe1e7) at >> .../include/grpc++/impl/codegen/completion_queue.h:148* >> *#8 0x00000000004085ca in main [main] (argc=1, argv=0x7fffffffe3a8) at >> minfail.cc:95* >> *(gdb)* >> >> >> On Tuesday, November 15, 2016 at 1:55:48 PM UTC-5, Craig Tiller wrote: >>> >>> You probably want to first do 'handle SIG36 noprint' to let gdb pass the >>> (totally legitimate) signal to the application. >>> >>> On Tue, Nov 15, 2016 at 8:56 AM <[email protected]> wrote: >>> >>>> >>>> Hi all, >>>> >>>> I've created a tiny code sample that is based off the hello world async >>>> greeter example. I keep getting a "pure virtual method called" in the >>>> grpc_completion_queue_next() function, and I'm having a hard time >>>> understanding why. What am I doing wrong? >>>> >>>> I've included the proto file, C++ code and gdb output... (the program >>>> is both a client or a server, if you give it a command line value of "c" >>>> it >>>> acts as a client). >>>> >>>> Thanks in advance! >>>> >>>> PROTO FILE >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> *syntax = "proto3";package helloworld;service Greeter{ rpc SayHello >>>> (HelloRequest) returns (stream HelloReply) {}}message HelloRequest{ >>>> string message = 1;}message HelloReply{ string reply = 1;}* >>>> >>>> >>>> C++ CODE >>>> >>>> *#include <iostream>* >>>> *#include <string>* >>>> *#include <grpc++/grpc++.h>* >>>> *#include "minfail.grpc.pb.h"* >>>> >>>> *using namespace std;* >>>> *using namespace helloworld;* >>>> >>>> *class CallData {* >>>> *public:* >>>> * CallData(Greeter::AsyncService* service, >>>> grpc::ServerCompletionQueue* cq) : service_(service), cq_(cq), >>>> responder_(&ctx_), status_(CREATE) {* >>>> * Proceed();* >>>> * }* >>>> >>>> * void Proceed() {* >>>> * if (status_ == CREATE) {* >>>> * status_ = PROCESS;* >>>> * service_->RequestSayHello(&ctx_, &request_, &responder_, >>>> cq_, cq_, this);* >>>> * } else if (status_ == PROCESS) {* >>>> * new CallData(service_, cq_);* >>>> * reply_.set_reply("hello " + request_.message());* >>>> * responder_.Write (reply_, this);* >>>> * responder_.Finish(grpc::Status::OK, this);* >>>> * status_ = FINISH;* >>>> * } else {* >>>> * GPR_ASSERT(status_ == FINISH);* >>>> * delete this;* >>>> * }* >>>> * }* >>>> >>>> *private:* >>>> * HelloRequest request_;* >>>> * HelloReply reply_;* >>>> * grpc::ServerAsyncWriter<HelloReply> responder_;* >>>> >>>> * enum CallStatus { CREATE, PROCESS, FINISH };* >>>> * CallStatus status_;* >>>> * grpc::ServerContext ctx_;* >>>> * grpc::ServerCompletionQueue* cq_;* >>>> * Greeter::AsyncService* service_;* >>>> *};* >>>> >>>> *class GreeterClient* >>>> *{* >>>> *public:* >>>> * GreeterClient (shared_ptr <grpc::Channel> channel)* >>>> * : stub_ (Greeter::NewStub (channel)) {}* >>>> * string* >>>> * SayHello (const string &user) {* >>>> * HelloRequest request;* >>>> * request.set_message (user);* >>>> * grpc::ClientContext context;* >>>> * unique_ptr <grpc::ClientReader <HelloReply>> reader >>>> (stub_->SayHello (&context, request));* >>>> * HelloReply reply;* >>>> * while (reader -> Read (&reply)) {* >>>> * cout << "SayHello returns " << reply.reply() << "\n";* >>>> * }* >>>> * grpc::Status status = reader -> Finish();* >>>> * if (status.ok()) {* >>>> * return (reply.reply());* >>>> * }* >>>> * return ("<RPC failed>");* >>>> * }* >>>> >>>> *private:* >>>> * unique_ptr<Greeter::Stub> stub_;* >>>> *};* >>>> >>>> *int* >>>> *main (int argc, char **argv)* >>>> *{* >>>> * string server_address ("0.0.0.0:50051 <http://0.0.0.0:50051>");* >>>> >>>> * if (argc == 2 && argv [1][0] == 'c') {* >>>> * GreeterClient greeter(grpc::CreateChannel (server_address, >>>> grpc::InsecureChannelCredentials()));* >>>> * cout << "Sending world...\n";* >>>> * cout << "Response is " << greeter.SayHello ("world") << "\n";* >>>> * } else {* >>>> * unique_ptr<grpc::ServerCompletionQueue> cq;* >>>> * Greeter::AsyncService service;* >>>> * unique_ptr<grpc::Server> server;* >>>> >>>> * grpc::ServerBuilder builder;* >>>> >>>> * builder.AddListeningPort(server_address, >>>> grpc::InsecureServerCredentials());* >>>> * builder.RegisterService(&service);* >>>> * cq = builder.AddCompletionQueue();* >>>> * server = builder.BuildAndStart();* >>>> >>>> * new CallData(&service, cq.get());* >>>> * CallData* tag; // uniquely identifies a request.* >>>> * bool ok;* >>>> * while (true) {* >>>> * GPR_ASSERT(cq->Next((void **)&tag, &ok));* >>>> * GPR_ASSERT(ok);* >>>> * tag->Proceed();* >>>> * }* >>>> >>>> * server->Shutdown();* >>>> * cq->Shutdown();* >>>> * }* >>>> *}* >>>> >>>> and run / GDB output: >>>> >>>> >>>> >>>> >>>> >>>> *$ ./minfailD1115 11:45:47.919769500 24264 >>>> env_linux.c:77] Warning: insecure environment read function >>>> 'getenv' usedpure virtual method calledterminate called without an active >>>> exceptionAborted (core dumped)* >>>> >>>> *$ gdb ./minfail* >>>> *... elided ...* >>>> *Program received signal SIG36, Real-time event 36.* >>>> *0x00000035ce0e8cec in epoll_pwait () from /lib64/libc.so.6* >>>> *(gdb) bt* >>>> *#0 0x00000035ce0e8cec in epoll_pwait () from /lib64/libc.so.6* >>>> *#1 0x00007ffff76f8d4a in ?? () from /.../lib/libgrpc++.so.1* >>>> *#2 0x00007ffff76f91a6 in ?? () from /.../lib/libgrpc++.so.1* >>>> *#3 0x00007ffff770d61b in grpc_completion_queue_next () from >>>> /.../lib/libgrpc++.so.1* >>>> *#4 0x00007ffff76e3f20 in >>>> grpc::CompletionQueue::AsyncNextInternal(void**, bool*, gpr_timespec) () >>>> from /.../lib/libgrpc++.so.1* >>>> *#5 0x000000000040919f in grpc::CompletionQueue::Next >>>> [_ZN4grpc15Completion...] (this=0x628fa0, tag=0x7fffffffe1e8, >>>> ok=0x7fffffffe1e7) at >>>> .../include/grpc++/impl/codegen/completion_queue.h:148* >>>> *#6 0x00000000004085ca in main [main] (argc=1, argv=0x7fffffffe3a8) at >>>> minfail.cc:95* >>>> *(gdb)* >>>> >>>> Any help greatly appreciated! >>>> >>>> Cheers, >>>> -RK >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "grpc.io" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> To post to this group, send email to [email protected]. >>>> Visit this group at https://groups.google.com/group/grpc-io. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/grpc-io/34f059a0-f825-4aa3-a725-84fb61e46b1f%40googlegroups.com >>>> >>>> <https://groups.google.com/d/msgid/grpc-io/34f059a0-f825-4aa3-a725-84fb61e46b1f%40googlegroups.com?utm_medium=email&utm_source=footer> >>>> . >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> -- You received this message because you are subscribed to the Google Groups "grpc.io" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/grpc-io. To view this discussion on the web visit https://groups.google.com/d/msgid/grpc-io/3435ff53-e851-418e-8013-f13444e67cc2%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
