Ошибка сегментации 64-битной программы на HP-UX PA RISC - PullRequest
0 голосов
/ 28 марта 2011

Я использую для тестирования машины 3 HP-UX PA RISC .Мой двоичный файл выходит из строя на одной машине PA RISC, где другие работают.Обратите внимание, что, хотя двоичный файл выполняется с проверкой версии, то есть он просто печатает версию и завершает работу и не выполняет никаких других операций, однако двоичный файл вызывает ошибку сегментации.что может быть вероятной причиной ошибки сегментации.Мне важно выяснить основную причину сбоя на одной коробке.Поскольку программа работает на 2 HP-UX, кажется, что это проблема среды?

Я попытался скопировать тот же кусок кода (т.е. объявить переменные, версию для печати и выйти) в тестовой программе и собрать с той же компиляциейварианты но это работает.Вот вывод gdb для программы.

$ gdb prg_us
Detected 64-bit executable.
Invoking /opt/langtools/bin/gdb64.
HP gdb 5.4.0 for PA-RISC 2.0 (wide), HP-UX 11.00
and target hppa2.0w-hp-hpux11.00.
Copyright 1986 - 2001 Free Software Foundation, Inc.
Hewlett-Packard Wildebeest 5.4.0 (based on GDB) is covered by the
GNU General Public License. Type "show copying" to see the conditions to
change it and/or distribute copies. Type "show warranty" for warranty/support.
..
(gdb) b  5573
Breakpoint 1 at 0x4000000000259e04: file pmgreader.c, line 5573 from /tmp/test/prg_us.
(gdb) r -v
Starting program: /tmp/test/prg_us -v

Breakpoint 1, main (argc=2, argv=0x800003ffbfff05f8) at pmgreader.c:5573
5573       if (argc ==2 && strcmp (argv[1], "-v") == 0)
Current language:  auto; currently c++
(gdb) n
5575           printf ("%s", VER);
(gdb) n
5576           exit(0);
(gdb) n

Program received signal SIGSEGV, Segmentation fault
  si_code: 0 - SEGV_UNKNOWN - Unknown Error.
0x800003ffbfb9e130 in real_free+0x480 () from /lib/pa20_64/libc.2
(gdb)

Что должно быть вероятной причиной?почему он работает на одном, а не на другом?

Ответы [ 2 ]

0 голосов
/ 29 марта 2011

Майкл Барр уже намекал на проблему: это глобальный объект.

Обратите внимание, что сбой происходит из функции free.Это указывает на освобождение памяти и, в свою очередь, на деструктор.Это имеет смысл с учетом контекста: глобальные деструкторы запускаются после exit(0).Трассировка стека покажет больше деталей.

0 голосов
/ 28 марта 2011

Просто длинный выстрел - включаете ли вы оба stdio.h и stdlib.h, так что прототипы для printf() и exit() известны компилятору?

На самом деле, немного подумав (и замечая, что C ++ находится в миксе), у вас может быть некоторая статическая инициализация объекта, вызывающая проблемы (возможно, повреждение кучи?).

К сожалению, похоже, что valgrind не поддерживается на PA-RISC - есть ли некоторыеподобный инструмент на PA-RISC можно запуститьЕсли нет, возможно, стоит запустить valgrind в сборке x64 вашей программы, если это не так сложно настроить.

...