Team,

Trying to get to the root of a very intermittent seg fault in my program.  Here's the snipped (not able to reproduce) as the section of code is part of a callback and I'm not sure how to reproduce it.  Here's the tickPrice method and the trace from gdb is below that ... any thoughts?


TJ

void ib_trading_engine::tickPrice(TickerId tickerId, TickType field, double price, const TickAttrib& attribs) {
this -> current_time();
ticksnapshot_complete_ = false;

last_tick spy_call_trade;
last_tick spy_put_trade;
last_tick qqq_call_trade;
last_tick qqq_put_trade;

spy_call_trade.contract(spy_call_contract_);
spy_call_trade.datetime(local_time_);
spy_call_trade.symbol(spy_call_symbol_);

spy_put_trade.contract(spy_put_contract_);
spy_put_trade.datetime(local_time_);
spy_put_trade.symbol(spy_put_symbol_);

qqq_call_trade.contract(qqq_call_contract_);
qqq_call_trade.datetime(local_time_);
qqq_call_trade.symbol(qqq_call_symbol_);

qqq_put_trade.contract(qqq_put_contract_);
qqq_put_trade.datetime(local_time_);
qqq_put_trade.symbol(qqq_put_symbol_);

try {
if (tickerId == 1001 && field == TickType::LAST) {
spy_strike_ = (unsigned int)std::trunc(price);
ticksnapshot_complete_ = true;

last_spy_price_ = bmp::cpp_dec_float_50(price);
}

else if (tickerId == 1002) {
switch (field) {
case TickType::BID: last_call_bid_ = bmp::cpp_dec_float_50(price);
break;
case TickType::ASK: last_call_ask_ = bmp::cpp_dec_float_50(price);
break;
case TickType::LAST: spy_call_trade.last(bmp::cpp_dec_float_50(price));
trade_queue_.push(spy_call_trade);
break;
default:
break;
}
}

else if (tickerId == 1003) {
switch (field) {
case TickType::BID: last_put_bid_ = bmp::cpp_dec_float_50(price);
break;
case TickType::ASK: last_put_ask_= bmp::cpp_dec_float_50(price);
break;
case TickType::LAST: spy_put_trade.last(bmp::cpp_dec_float_50(price));
trade_queue_.push(spy_put_trade);
break;
default:
break;
}
}

else if (field == TickType::LAST && tickerId == 2001) {
qqq_strike_ = (unsigned int)std::trunc(price);
ticksnapshot_complete_ = true;

last_qqq_price_ = bmp::cpp_dec_float_50(price);
}

else if (tickerId == 2002) {
switch (field) {
case TickType::BID: last_call_bid_ = bmp::cpp_dec_float_50(price);
break;
case TickType::ASK: last_call_ask_ = bmp::cpp_dec_float_50(price);
break;
case TickType::LAST: qqq_call_trade.last(bmp::cpp_dec_float_50(price));
trade_queue_.push(qqq_call_trade);
break;
default:
break;
}
}

else if (tickerId == 2003) {
switch (field) {
case TickType::BID: last_put_bid_ = bmp::cpp_dec_float_50(price);
break;
case TickType::ASK: last_put_ask_= bmp::cpp_dec_float_50(price);
break;
case TickType::LAST: qqq_put_trade.last(bmp::cpp_dec_float_50(price));
trade_queue_.push(qqq_put_trade);
break;
default:
break;
}
}
}

catch (const std::exception& exception) {
std::cerr << "ib_trading_engine::tickPrice() exception: " << exception.what() << "\n";
}
}

Core was generated by `./atm_call_paper_2.1'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00000000004221fd in boost::multiprecision::backends::cpp_dec_float<50u, int, void>::pow2 (p=30) at /usr/include/boost/multiprecision/cpp_dec_float.hpp:2936
2936   cpp_dec_float<Digits10, ExponentType, Allocator> t;
[Current thread is 1 (Thread 0x7fc4418027c0 (LWP 20245))]
(gdb) bt
#0  0x00000000004221fd in boost::multiprecision::backends::cpp_dec_float<50u, int, void>::pow2 (p=30) at /usr/include/boost/multiprecision/cpp_dec_float.hpp:2936
#1  0x00000000004157ba in boost::multiprecision::backends::cpp_dec_float<50u, int, void>::operator=<double> (this=0x7fc440fe2f40, a=2.9500000000000002) at /usr/include/boost/multiprecision/cpp_dec_float.hpp:2290
#2  0x0000000000411c17 in boost::multiprecision::backends::cpp_dec_float<50u, int, void>::cpp_dec_float<double>(double, std::enable_if<std::is_floating_point<double>::value&&(!std::is_same<double, __float128>::value), void>::type*) (this=0x7fc440fe2f40,
    val=2.9500000000000002) at /usr/include/boost/multiprecision/cpp_dec_float.hpp:249
#3  0x000000000040fcb6 in boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1>::number<double>(double const&, std::enable_if<std::is_convertible<boost::multiprecision::detail::canonical<double, boost::multiprecision::backends::cpp_dec_float<50u, int, void> >::type, boost::multiprecision::backends::cpp_dec_float<50u, int, void> >::value&&(!boost::multiprecision::detail::is_restricted_conversion<boost::multiprecision::detail::canonical<double, boost::multiprecision::backends::cpp_dec_float<50u, int, void> >::type, boost::multiprecision::backends::cpp_dec_float<50u, int, void> >::value), void>::type*) (this=0x7fc440fe2f40, v=@0x7fc440fe1d60: 2.9500000000000002) at /usr/include/boost/multiprecision/number.hpp:64
#4  0x0000000000447332 in ib_trading_engine::tickPrice (this=0x1dd0650, tickerId=1002, field=BID, price=2.9500000000000002, attribs=...) at ../src/ib_trading_engine.cpp:700
#5  0x000000000049c5c4 in EDecoder::processTickPriceMsg (this=0x1dd30c0, ptr=0x7fc43c0077a6 "00%", endPtr=0x7fc43c0077a6 "00%") at ../src/client/EDecoder.cpp:65
#6  0x00000000004a7ea6 in EDecoder::parseAndProcessMsg (this=0x1dd30c0, beginPtr=@0x7fc440fe33e8: 0x7fc43c007790 "1", endPtr=0x7fc43c0077a6 "00%") at ../src/client/EDecoder.cpp:2247
#7  0x00000000004bee93 in EReader::processMsgs (this=0x1dd30b0) at ../src/client/EReader.cpp:282
#8  0x0000000000444630 in ib_trading_engine::process_messages (this=0x1dd0650) at ../src/ib_trading_engine.cpp:405
#9  0x000000000044465f in ib_trading_engine::current_time (this=0x1dd0650) at ../src/ib_trading_engine.cpp:410
#10 0x0000000000447086 in ib_trading_engine::tickPrice (this=0x1dd0650, tickerId=1002, field=BID, price=2.96, attribs=...) at ../src/ib_trading_engine.cpp:666