Thrift: -› операторът ми дава грешка при сегментиране

РЕДАКТИРАНЕ: juan.facorro ме насочи към истинския проблем, който е, че когато сървърът не работи, mytransport->open() извиква GlobalOutput.perror("error code") в TSocket.cpp. Но в моя код mytransport->open() беше извикан преди GlobalOutput да бъде инициализиран

вижте тази връзка за повече информация


Имам shared_ptr, наречено mytransport, и го декларирам така:

shared_ptr<TTransport> mytransport(new TBufferedTransport(socket));

но когато извикам mytransport->open();, получавам грешка при сегментиране и горната част на проследяването на стека казва:

#0  0x00000000 in ?? ()
#1  0x08068281 in apache::thrift::TOutput::perror (this=0x807a44c, message=0x9dc0e14 "TSocket::open() connect() <Host: localhost Port: 9090>", errno_copy=111) at src/thrift/Thrift.cpp:65
#2  0x080670eb in perror (errno_copy=<optimized out>, message=..., this=<optimized out>) at ./src/thrift/Thrift.h:123
#3  apache::thrift::transport::TSocket::openConnection (this=0xbfe69ea0, res=0xbfe69e9c) at src/thrift/transport/TSocket.cpp:277

Не разбирам съвсем оператора "->", но изглежда, че mytransport сочи към NULL обект. Някакви идеи?

РЕДАКТИРАНЕ: Ако поставя кода в основния клас, той работи нормално и ми дава грешката, която искам:

TSocket::open() connect() <Host: localhost Port: 9090>Connection refused

(виж #1 в проследяването на стека). Въпреки това, когато поставя кода в клас вътре в библиотека (която основният клас използва), тогава получавам грешката на сегментирането. Така че може да е някакъв проблем с обхвата?


person woojoo666    schedule 18.07.2013    source източник
comment
Това не бих получил от този стек за повиквания. Можете да проверите валидността на показалеца, държащ моя mytransport, просто като използвате условен (if(mytransport) { // добре е...}`.   -  person Chad    schedule 19.07.2013
comment
благодаря, опитах това, но все още получавам грешка при сегментиране. Някакви идеи каква може да е истинската причина?   -  person woojoo666    schedule 19.07.2013


Отговори (1)


Въз основа на проследяването на стека и след като направихме известно проучване на кода за TSocket.cpp, ред 182 показва абсолютно същото съобщение за грешка в метода openConnection(). errno_copy получава своята стойност от errno, който има стойност 111. Според това тази стойност съответства на ECONNREFUSED. Така че бих проверил връзката на другия край.

person juan.facorro    schedule 18.07.2013
comment
Знам, че грешката е от връзката, не съм стартирал сървъра нарочно. Проблемът е, че получавам съобщение за грешка при сегментиране, вместо обичайната грешка за отказ на свързване - person woojoo666; 19.07.2013
comment
И така, извикването open() обгръща ли друга библиотека, която хвърля изключение? - person Chad; 19.07.2013
comment
Погледнах кода TSocket.cpp и открих на ред 182 GlobalOutput.perror("error message goes here"), но GlobalOutput все още не е инициализиран, което причинява грешката. Благодаря, че ме насочихте в правилната посока! - person woojoo666; 19.07.2013