qrencode — Ошибка сегментации (дамп ядра)

Я сделал рабочую программу, которая генерировала изображение с заданной строкой. Он полностью работает с моим 32-битным дистрибутивом Slackware и другими 32-битными дистрибутивами.

Теперь мне нужно реализовать его на клиентской машине, которая представляет собой AIX powerpc. Он скомпилирован без каких-либо проблем и, похоже, работает (все остальные функции работают и дают правильные результаты), за исключением случаев, когда я вызываю эти две функции «QRcode_encodeString» и «QRcode_encodeData». Это продолжает давать мне ошибку сегментации.

Вы можете предположить, что моя единственная строка main() - это вызов функции:

#include <stdio.h>
#include <qrencode.h>

int main(void)
{
   QRcode* pQRC = QRcode_encodeString("abc", 0, QR_ECLEVEL_L, QR_MODE_8, 0);    
   return 0;
}

У меня нет gdb на клиентской машине и нет привилегий root. Он работает с «QRcode_encodeStringMQR()», который генерирует микро QR-код, но это не решение для меня. Он создает файл дампа с именем «ядро», который я не могу использовать, поскольку на этой машине нет gdb... И я предполагаю, что не могу открыть его на другой машине, поскольку они не разделяют такая же архитектура. Я вообще понятия не имею, как решить эту проблему...

Опять же, этот код работает в моем дистрибутиве Slackware.

К сожалению, мои знания о powerpc и AIX ограничены только этим опытом.

Я забыл упомянуть, что доступен только cc, и я компилирую так:

cc qrgen.c -lqrencode -L/usr/local/lib -I/usr/local/include

person Vcoder    schedule 17.03.2015    source источник
comment
на ittoolbox.com зависает гораздо больше пользователей AIX. На сайте есть функция «Группы». Ищите как Unix, так и AIX. Должно быть что-то вроде dbx, что эквивалентно gdb. Я думаю, что appropos работает, поэтому попробуйте поискать dbx или debug. Удачи.   -  person shellter    schedule 18.03.2015
comment
Большое спасибо! Вы правы, мне нужно использовать dbx, а не gdb, я понятия не имел. Теперь я могу найти эту надоедливую ошибку!   -  person Vcoder    schedule 18.03.2015


Ответы (2)


Просто для информации: мне удалось скомпилировать его в среде Linux on Power, и он работает нормально, без ошибок сегментации. Машина: POWER8 ОС: Ubuntu 15.04

ubuntu@ubuntu1504:~/qr$ cat hello.c 
#include <stdio.h>
#include <qrencode.h>

int main(void)
{
   QRcode* pQRC = QRcode_encodeString("abc", 0, QR_ECLEVEL_L, QR_MODE_8, 0);    
   return 0;
}

ubuntu@ubuntu1504:~/qr$ gcc hello.c  -lqrencode

ubuntu@ubuntu1504:~/qr$ ./a.out 

ubuntu@ubuntu1504:~/qr$ strace  ./a.out 
execve("./a.out", ["./a.out"], [/* 20 vars */]) = 0
brk(0)                                  = 0x1003f690000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=42765, ...}) = 0
mmap(NULL, 42765, PROT_READ, MAP_PRIVATE, 3, 0) = 0x3fff816c0000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/usr/lib/powerpc64le-linux-gnu/libqrencode.so.3", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0\25\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=67496, ...}) = 0
mmap(NULL, 131832, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3fff81690000
mmap(0x3fff816a0000, 131072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x3fff816a0000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/powerpc64le-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0\25\0\1\0\0\0@R\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1789000, ...}) = 0
mmap(NULL, 1860208, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3fff814c0000
mmap(0x3fff81670000, 131072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1a0000) = 0x3fff81670000
close(3)                                = 0
mprotect(0x3fff81670000, 65536, PROT_READ) = 0
mprotect(0x3fff816a0000, 65536, PROT_READ) = 0
mprotect(0x10010000, 65536, PROT_READ)  = 0
mprotect(0x3fff81720000, 65536, PROT_READ) = 0
munmap(0x3fff816c0000, 42765)           = 0
brk(0)                                  = 0x1003f690000
brk(0x1003f6c0000)                      = 0x1003f6c0000
exit_group(0)                           = ?
+++ exited with 0 +++
person Breno Leitão    schedule 18.03.2015
comment
Я думаю, что понял это, не могли бы вы сказать мне, у вас 32-битная или 64-битная версия Ubuntu? - person Vcoder; 18.03.2015

Я нашел проблему ... Установка библиотеки вызвала проблемы и привела к тому, что символические ссылки существовали в виде простого файла, а библиотеки просто не было ...

Это отсутствующий файл "/usr/local/lib/libqrencode.so.3.4.4", который является самим кодом... Я смотрел файлы и не заметил этого, потому что был файл с именем libqrencode.so. .3.4, но этот файл должен был быть символической ссылкой на libqrencode.so.3.4.4, поскольку libqrencode.so.3.4.4 не существовало, вместо того, чтобы символическая ссылка не сработала, он создал пустой файл с тем же именем. ..

person Vcoder    schedule 20.03.2015