[eigen] Segfault in test matrixExponential_2 |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
Hello,
I'm trying to understand a segmentation fault in the matrixExponential_2
test in unsupported/test. Unfortunately, it's rather sensitive: when I
start removing code in an attempt to get a minimal test example, the
segmentation fault disappears, even though the code has nothing to do with
it. The segfault only happens when compiling with g++ 4.3 with the flags
-O2 and -msse2; it disappears when using g++ 4.4 (so perhaps I should not
bother ...).
I did manage to get a backtrace (compiled with -g2 -fno-inline); see
below. The arguments in frame #1 are wrong (this = 0x0), but 'this' in
frame #1 should be the same as dst in frame #2. I guess that means that
the stack frame is corrupted by a dangling pointer?
I'm not sure of the best way to proceed. One problem is that it's deep in
Eigen's internal code which I don't understand. Any suggestions?
Thanks,
Jitse
Backtrace from gdb:
#0 0x08049957 in Eigen::ei_pload<double> (from=0xbffb7720)
at ../Eigen/src/Core/arch/SSE/PacketMath.h:176
#1 0x0807844e in Eigen::MatrixBase<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 33331, 33331, 0, 32>, 1, 33331, 0, 32> >::copyPacket<Eigen::CwiseBinaryOp<Eigen::ei_scalar_sum_op<double>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 33331, 33331, 0, 32>, 1, 33331, 2, 32>, Eigen::CwiseUnaryOp<Eigen::ei_scalar_multiple_op<double>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 1, 33331, 0, 32>, 1, 33331, 0, 32> > >, 1, 0> (this=0x0, index=-1074039000,
other=@0xbffb7720) at ../Eigen/src/Core/Coeffs.h:378
#2 0x08078541 in Eigen::ei_assign_impl<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 33331, 33331, 0, 32>, 1, 33331, 0, 32>, Eigen::CwiseBinaryOp<Eigen::ei_scalar_sum_op<double>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 33331, 33331, 0, 32>, 1, 33331, 2, 32>, Eigen::CwiseUnaryOp<Eigen::ei_scalar_multiple_op<double>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 1, 33331, 0, 32>, 1, 33331, 0, 32> > >, 1, 0>::run (dst=@0xbffb7774, src=@0xbffb7720)
at ../Eigen/src/Core/Assign.h:341
#3 0x080785d2 in Eigen::MatrixBase<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 33331, 33331, 0, 32>, 1, 33331, 0, 32> >::lazyAssign<Eigen::CwiseBinaryOp<Eigen::ei_scalar_sum_op<double>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 33331, 33331, 0, 32>, 1, 33331, 2, 32>, Eigen::CwiseUnaryOp<Eigen::ei_scalar_multiple_op<double>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 1, 33331, 0, 32>, 1, 33331, 0, 32> > > > (this=0xbffb7774, other=@0xbffb7720)
at ../Eigen/src/Core/Assign.h:429
#4 0x08078711 in Eigen::MapBase<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 33331, 33331, 0, 32>, 1, 33331, 0, 32> >::operator+=<Eigen::CwiseUnaryOp<Eigen::ei_scalar_multiple_op<double>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 1, 33331, 0, 32>, 1, 33331, 0, 32> > > (this=0xbffb7774,
other=@0xbffb7784) at ../Eigen/src/Core/MapBase.h:214
#5 0x080787b5 in Eigen::ei_outer_product_selector<1>::run<Eigen::GeneralProduct<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 33331, 1, 0, 32>, 33331, 1, 0, 32>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 1, 33331, 0, 32>, 1, 33331, 0, 32>, 0>, Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 33331, 33331, 0, 32> > (prod=@0xbffb78d8, dest=@0xbffb7828, alpha=-1)
at ../Eigen/src/Core/Product.h:237
#6 0x08078840 in Eigen::ProductBase<Eigen::GeneralProduct<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 33331, 1, 0, 32>, 33331, 1, 0, 32>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 1, 33331, 0, 32>, 1, 33331, 0, 32>, 0>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 33331, 1, 0, 32>, 33331, 1, 0, 32>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 1, 33331, 0, 32>, 1, 33331, 0, 32> >::subTo<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 33331, 33331, 0, 32> > (this=0xbffb78d8, dst=@0xbffb7828)
at ../Eigen/src/Core/ProductBase.h:109
#7 0x08078878 in Eigen::NoAlias<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 33331, 33331, 0, 32> >::operator-=<Eigen::GeneralProduct<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 33331, 1, 0, 32>, 33331, 1, 0, 32>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 1, 33331, 0, 32>, 1, 33331, 0, 32>, 0>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 33331, 1, 0, 32>, 33331, 1, 0, 32>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, 33331, 33331, 1, 33331, 33331>, 0>, 33331, 33331, 0, 32>, 1, 33331, 0, 32>, 1, 33331, 0, 32> > (this=0xbffb78e8, other=@0xbffb78d8) at ../Eigen/src/Core/NoAlias.h:71
#8 0x08078b5e in Eigen::ei_partial_lu_impl<double, 1>::unblocked_lu (
lu=@0xbffb79e4, row_transpositions=0xbffb7a8c,
nb_transpositions=@0xbffb7a98) at ../Eigen/src/LU/PartialPivLU.h:264
#9 0x08084e38 in Eigen::ei_partial_lu_impl<double, 1>::blocked_lu (rows=3,
cols=3, lu_data=0xbffb7b2c, luStride=3, row_transpositions=0xbffb7a8c,
nb_transpositions=@0xbffb7a98, maxBlockSize=256)
at ../Eigen/src/LU/PartialPivLU.h:297
#10 0x08084f49 in Eigen::ei_partial_lu_inplace<Eigen::Matrix<double, 3, 3, 1, 3, 3>, Eigen::Matrix<int, 3, 1, 0, 3, 1> > (lu=@0xbffb7b2c,
row_transpositions=@0xbffb7a8c, nb_transpositions=@0xbffb7a98)
at ../Eigen/src/LU/PartialPivLU.h:373
#11 0x0808502a in Eigen::PartialPivLU<Eigen::Matrix<double, 3, 3, 1, 3, 3> >::compute (this=0xbffb7b2c, matrix=@0xbffb7cf0)
at ../Eigen/src/LU/PartialPivLU.h:390
#12 0x0808514f in PartialPivLU (this=0xbffb7b2c, matrix=@0xbffb7cf0)
at ../Eigen/src/LU/PartialPivLU.h:198
#13 0x080851a1 in Eigen::MatrixBase<Eigen::Matrix<double, 3, 3, 1, 3, 3> >::partialPivLu (this=0xbffb7cf0) at ../Eigen/src/LU/PartialPivLU.h:453
#14 0x08085ef2 in MatrixExponential (this=0xbffb7c14, M=@0xbffb7d88,
result=0xbffb7e88)
at ../unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h:195
#15 0x08086035 in Eigen::ei_matrix_exponential<Eigen::Matrix<double, 3, 3, 1, 3, 3> > (M=@0xbffb7ed0, result=0xbffb7e88)
at ../unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h:304
#16 0x0808b32a in randomTest<Eigen::Matrix<double, 3, 3, 1, 3, 3> > (
m=@0xbffb7f68, tol=1e-13) at ../unsupported/test/matrixExponential.cpp:105
#17 0x08049425 in test_matrixExponential ()
at ../unsupported/test/matrixExponential.cpp:120
#18 0x0804965b in main (argc=1, argv=Cannot access memory at address 0x6
) at ../test/main.h:445