этот указатель теряется при вызове метода-члена

Я столкнулся со странной проблемой при компиляции моей программы с использованием 64-разрядной версии g ++ 4.7.0 на компьютере с Fedora 17 x86_64 (та же программа хорошо работает на 32-разрядной версии Fedora).

Программа слишком сложна, и я не могу найти простой способ создать небольшой пример кода. Но из следующей записи GDB вы можете увидеть проблему.

Program received signal SIGSEGV, Segmentation fault.
0x000000000042a4b0 in boost::shared_ptr<cppPNML::details::ddObj>::operator!(this=0x100000007)
at /usr/include/boost/smart_ptr/detail/operator_bool.hpp:55
55          return px == 0;
Missing separate debuginfos, use: debuginfo-install gnome-keyring-3.4.1-3.fc17.x86_64
(gdb) bt
#0  0x000000000042a4b0 in boost::shared_ptr<cppPNML::details::ddObj>::operator! (this=0x100000007)
at /usr/include/boost/smart_ptr/detail/operator_bool.hpp:55
#1  0x00000000004202a5 in cppPNML::pnNode::getBBox (this=0xffffffff) at cpp_pnml.cpp:131
#2  0x000000000040eca4 in draw_page (g=..., painter=...) at pnml2pdf.cpp:178
#3  0x000000000040e3b9 in main (argc=2, argv=0x7fffffffe188) at pnml2pdf.cpp:106
(gdb) up
#1  0x00000000004202a5 in cppPNML::pnNode::getBBox (this=0xffffffff) at cpp_pnml.cpp:131
131   if(!p_) return pair<double, double>(0,0);
(gdb) up
#2  0x000000000040eca4 in draw_page (g=..., painter=...) at pnml2pdf.cpp:178
178     boost::tie(w, h) = node.getBBox();
(gdb) p node
$1 = {<cppPNML::pnObj> = {_vptr.pnObj = 0x79a490, p_ = {px = 0x7c40a0, pn = {pi_ = 0x7c4170}}}, <No data fields>}
(gdb) l
173   QRectF bound(0,0,0,0);
174
175   // nodes
176   for(pnNode node = g.front<pnNode>(); node.valid(); node = node.next()) {
177     double h, w, x, y, wa, ha, xa, ya, angle;
178     boost::tie(w, h) = node.getBBox();
179     angle = atan2(h, w);
180     boost::tie(x, y) = node.getPosition();
181     wa = 0; ha = 0; xa = 0; ya = 0;
182
(gdb)

Отлаживаемая программа — это программа для графической печати (pnml2pdf), которая рисует график в pdf с использованием QT4.
Узел объекта принадлежит классу pnNode, который определяется моей собственной библиотекой структуры графических данных (довольно сложная, https://github.com/wsong83/cppPNML).
Показана ошибка SEG, где смарт-указатель не инициализирован.
Через обратную трассировку вы можете видеть, что указатель this на node.getBBox () недействителен.
Тем не менее, печать узла с уровня выше верхнего уровня показывает, что узел на самом деле в порядке.

Я полностью запутался здесь.

Кто-нибудь имеет какие-либо подсказки или нужен еще сегмент кода? Заранее спасибо!

Обновить:
Благодаря совету @atzz я уверен, что вычисление этого указателя в методе-члене getBBox () привело к неверному адресу. Проблема вызвана не какой-либо ошибкой исходного кода (прямое связывание объектных файлов устранит ошибку сегмента), а вызвана командой генерации 64-битной статической библиотеки «ar» (так как определение pnNode определено в статической библиотеке, а не в объектный файл). Кажется, теперь статическая библиотека неверна и вызывает неправильные вычисления.

До сих пор копаю … Обновлю результат, если кому-то еще интересно узнать.

-1

Решение

  1. Это оптимизированная сборка или отладочная? Мне кажется, что это должно произойти с ошибкой в ​​строке 176, а не в строке 178.

  2. Вы уверены, что петля верна? Похоже, вы идете через конец. Я подозреваю, что ваша реализация node.valid() либо не делает правильную вещь, либо не подходит для проверки цикла.

Значение 0xffffffff выглядит как std::iterator end() значение, так что я думаю, что вам нужно либо проверить свой цикл с этим, или убедиться, что pnObj::valid() const { return p_ != NULL && p_ != 0xffffffff; }

Также, как вы реализуете next() просто выглядит неправильно. Создание итератора, поиск идентификатора строки и затем вызов next() на итераторе?

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]