Boost logo

Boost Users :

From: æ³°å¿— (tjisana.lewis_at_[hidden])
Date: 2022-02-10 18:22:55


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



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net