Как я могу отладить собственные ошибки выравнивания, когда они кажутся не связанными с точным кодом, который их запускает - PullRequest
0 голосов
/ 13 января 2020

Я пишу код, который использует библиотеку Eigen matrix для преобразования координат, а также PCL для обработки облака точек (которая также часто использует Eigen). Я продолжаю получать ошибки утверждения от Eigen, о непривязанных доступах, несмотря на то, что я наблюдал все в документации о выравнивании типов Eigen (https://eigen.tuxfamily.org/dox/group__DenseMatrixManipulation__Alignement.html).

Я могу только вызвать это утверждение, когда какой-то Eigen-код выполнялся раньше, но не смог точно определить, каковы точные условия. Например, это код, который дает сбой:

Affine3f Transform::getAffine() const {
    // ... Vector3f translation(...)
    // ... Quaternionf rotation(...)
  Affine3f affine = Affine3:f:Identity(); /// <--- 
  affine.translate(translation);
  affine.rotate(rotation);
  return affine;
}

, но только если ранее был выполнен некоторый собственный код. Возможно, это связано с тем, что проблема возникает только после некоторых выделений, сделанных Eigen::aligned_allocator.

. Однако страницы справки говорят мне, что я должен использовать отладчик, чтобы точно определить, какой объект выровнен:

Например, если вы используете G CC, вы можете использовать отладчик GDB следующим образом:

$ gdb ./my_program          # Start GDB on your program
> run                       # Start running your program
...                         # Now reproduce the crash!
> bt                        # Obtain the backtrace

Теперь, когда вы точно знаете, где находится ваш собственный код проблема возникает, читайте дальше, чтобы понять, что вам нужно изменить.

Я, конечно, делаю это, но сбой кода здесь, кажется, удовлетворяет всем требованиям.

Вопрос

Как эффективно отладить, какой код вызывает смещение, когда ошибка возникает только во время более поздних выделений?

...