2016-08-23 11 views
1

Ich aktualisiere ~ 3yr alten Code und stürze ab, versuche ein Paar aus Vector2d und Matrix2d zu machen. Grob gesagt, ist der CodeEigen SIGSEGV während make_pair

vector<pair<Vector2d, Matrix2d>> list; 
list.resize(points.size()); 
Vector2d md; 
Matrix2d Sd; 
for(int i=0; i<n; i++) { 
    // do stuff to assign elements of md and Sd 
    // ... 
    list[i] = make_pair(md, Sd); // SIGSEGV on this line 
} 

ich eine altes bug gefunden, die in den letzten beiden Ebenen des Stapels ähnlich sehen aber, dass Fehler markiert als feste und ich bestätigte, dass der Updates von diesem Patch noch vorhanden ist. Ich habe versucht, einen einfachen Testfall zu machen, aber es läuft ohne Probleme. Hat jemand eine Idee, was das Problem sein könnte?

Misc Info:

  • Arch Linux
  • gcc 6.1.1
  • eigen 3.2.9

Hier ist der Backtrace:

Thread 7 "flightControlle" received signal SIGSEGV, Segmentation fault. 
[Switching to Thread 0x7fffd7152700 (LWP 12024)] 
0x00000000005e846b in _mm_load_pd (__P=0x0) at /usr/lib/gcc/x86_64-pc-linux-gnu/6.1.1/include/emmintrin.h:119 
119  return *(__m128d *)__P; 
(gdb) bt 
#0 0x00000000005e846b in _mm_load_pd (__P=0x0) at /usr/lib/gcc/x86_64-pc-linux-gnu/6.1.1/include/emmintrin.h:119 
#1 Eigen::internal::pload<double __vector(2)>(Eigen::internal::unpacket_traits<double __vector(2)>::type const*) (from=0x0) at /usr/include/eigen3/Eigen/src/Core/arch/SSE/PacketMath.h:220 
#2 0x000000000060310b in Eigen::internal::ploadt<double __vector(2), 1>(Eigen::internal::unpacket_traits<double __vector(2)>::type const*) (from=0x0) at /usr/include/eigen3/Eigen/src/Core/GenericPacketMath.h:290 
#3 0x0000000000659523 in Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> >::packet<1> (this=0x0, rowId=0, colId=0) at /usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h:184 
#4 0x00000000006a40fe in Eigen::SwapWrapper<Eigen::Matrix<double, 2, 1, 0, 2, 1> >::copyPacket<Eigen::Matrix<double, 2, 1, 0, 2, 1>, 1, 1> (this=0x7fffd7150a30, rowId=0, colId=0, other=...) 
    at /usr/include/eigen3/Eigen/src/Core/Swap.h:100 
#5 0x00000000006a1da3 in Eigen::DenseCoeffsBase<Eigen::SwapWrapper<Eigen::Matrix<double, 2, 1, 0, 2, 1> >, 1>::copyPacketByOuterInner<Eigen::Matrix<double, 2, 1, 0, 2, 1>, 1, 1> (this=0x7fffd7150a30, outer=0, 
    inner=0, other=...) at /usr/include/eigen3/Eigen/src/Core/DenseCoeffsBase.h:548 
#6 0x000000000069fa0e in Eigen::internal::assign_innervec_CompleteUnrolling<Eigen::SwapWrapper<Eigen::Matrix<double, 2, 1, 0, 2, 1> >, Eigen::Matrix<double, 2, 1, 0, 2, 1>, 0, 2>::run (dst=..., src=...) 
    at /usr/include/eigen3/Eigen/src/Core/Assign.h:206 
#7 0x000000000069d1f7 in Eigen::internal::assign_impl<Eigen::SwapWrapper<Eigen::Matrix<double, 2, 1, 0, 2, 1> >, Eigen::Matrix<double, 2, 1, 0, 2, 1>, 2, 2, 0>::run (dst=..., src=...) 
    at /usr/include/eigen3/Eigen/src/Core/Assign.h:342 
#8 0x000000000069af38 in Eigen::DenseBase<Eigen::SwapWrapper<Eigen::Matrix<double, 2, 1, 0, 2, 1> > >::lazyAssign<Eigen::Matrix<double, 2, 1, 0, 2, 1> > (this=0x7fffd7150a30, other=...) 
    at /usr/include/eigen3/Eigen/src/Core/Assign.h:506 
#9 0x000000000069856f in Eigen::DenseBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> >::swap<Eigen::Matrix<double, 2, 1, 0, 2, 1> > (this=0x7fffd7150c90, other=...) 
    at /usr/include/eigen3/Eigen/src/Core/DenseBase.h:384 
#10 0x000000000069591a in Eigen::internal::matrix_swap_impl<Eigen::Matrix<double, 2, 1, 0, 2, 1>, Eigen::Matrix<double, 2, 1, 0, 2, 1>, false>::run (a=..., b=...) 
    at /usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h:805 
#11 0x0000000000693785 in Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> >::_swap<Eigen::Matrix<double, 2, 1, 0, 2, 1> > (this=0x7fffd7150c90, other=...) 
    at /usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h:682 
#12 0x00000000006923c6 in Eigen::Matrix<double, 2, 1, 0, 2, 1>::swap<Eigen::Matrix<double, 2, 1, 0, 2, 1> > (this=0x7fffd7150c90, other=...) at /usr/include/eigen3/Eigen/src/Core/Matrix.h:334 
#13 0x00000000006909f9 in Eigen::Matrix<double, 2, 1, 0, 2, 1>::operator=(Eigen::Matrix<double, 2, 1, 0, 2, 1>&&) (this=0x0, 
    other=<unknown type in /home/ryantr/Software/FlightControl/Rover/build/flightController, CU 0x5b3bd1, DIE 0x73ce2f>) at /usr/include/eigen3/Eigen/src/Core/Matrix.h:224 
#14 0x000000000068f440 in std::pair<Eigen::Matrix<double, 2, 1, 0, 2, 1>, Eigen::Matrix<double, 2, 2, 0, 2, 2> >::operator=(std::pair<Eigen::Matrix<double, 2, 1, 0, 2, 1>, Eigen::Matrix<double, 2, 2, 0, 2, 2> >&&) (this=0x0, __p=<unknown type in /home/ryantr/Software/FlightControl/Rover/build/flightController, CU 0x5b3bd1, DIE 0x73e9e5>) at /usr/include/c++/6.1.1/bits/stl_pair.h:319 
#15 0x000000000068a452 in ICSL::Quadrotor::VelocityEstimator::calcPriorDistributions (mDeltaList=std::vector of length 1, capacity 1 = {...}, SDeltaList=std::vector of length 1, capacity 1 = {...}, 
    priorDistList=std::vector of length 0, capacity 0, points=std::vector of length 1, capacity 1 = {...}, mv=..., Sv=..., mz=0.050000000000000003, varz=1, focalLength=262.0029296875, dt=0.033000000000000002, 
    omega=...) at /home/ryantr/Software/FlightControl/Rover/src/VelocityEstimator.cpp:566 

hier Informationen über die Zustand von md und Sd, wenn das anders ist en:

$1 = {<Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> >> = {<Eigen::MatrixBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> >> = {<Eigen::DenseBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> >> = {<Eigen::internal::special_scalar_op_base<Eigen::Matrix<double, 2, 1, 0, 2, 1>, double, double, Eigen::DenseCoeffsBase<Eigen::Matrix<double, 2, 1, 0, 2, 1>, 3>, false>> = {<Eigen::DenseCoeffsBase<Eigen::Matrix<double, 2, 1, 0, 2, 1>, 3>> = {<Eigen::DenseCoeffsBase<Eigen::Matrix<double, 2, 1, 0, 2, 1>, 1>> = {<Eigen::DenseCoeffsBase<Eigen::Matrix<double, 2, 1, 0, 2, 1>, 0>> = {<Eigen::EigenBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> >> = {<No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, m_storage = {m_data = {array = {-6.5748748779296875, 
      -96.418296813964844}}}}, <No data fields>} 
(gdb) p Sd 
$2 = {<Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >> = {<Eigen::MatrixBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >> = {<Eigen::DenseBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >> = {<Eigen::internal::special_scalar_op_base<Eigen::Matrix<double, 2, 2, 0, 2, 2>, double, double, Eigen::DenseCoeffsBase<Eigen::Matrix<double, 2, 2, 0, 2, 2>, 3>, false>> = {<Eigen::DenseCoeffsBase<Eigen::Matrix<double, 2, 2, 0, 2, 2>, 3>> = {<Eigen::DenseCoeffsBase<Eigen::Matrix<double, 2, 2, 0, 2, 2>, 1>> = {<Eigen::DenseCoeffsBase<Eigen::Matrix<double, 2, 2, 0, 2, 2>, 0>> = {<Eigen::EigenBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >> = {<No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, m_storage = {m_data = {array = {8947423.3324944824, 110733.5419973651, 
      110733.5419973651, 13614569.654632445}}}}, <No data fields>} 
+0

können Sie bestätigen, dass n kleiner als oder gleich points.size()? –

Antwort

2

Dies ist ein Alignment-Problem. Sehen Sie dieses intro, und in Ihrem Fall wird diese page Ihnen die Lösung geben. Kurz gesagt, entweder verwenden blockfrei Typen:

typedef Matrix<double,2,1,DontAlign> Vector2du; 
typedef Matrix<double,2,2,DontAlign> Matrix2du; 
vector<pair<Vector2du, Matrix2du>> list; 

oder ein ausgerichtetes allocator zu std::vector passieren:

vector<pair<Vector2du, Matrix2du>,Eigen::aligned_allocator<pair<Vector2du, Matrix2du>>> list; 
+0

Hat sich in den letzten Jahren irgendetwas damit verändert? Oder einfach Zufall, dass ich vorher keine Probleme gesehen habe? – ryan0270

+0

Nichts hat sich auf unserer Seite geändert, aber gcc6 aktiviert standardmäßig C++ 11 und verwendet daher Moves statt tiefer Kopien (wie im Backtrace zu sehen). Das Kompilieren mit -std = C++ 03 verbirgt das Problem wahrscheinlich. – ggael