Я только что заметил, что не могу получить функцию, возвращающую структуру.
Я запускаю это на ARM32 / debian docker Изображение с включенными потоками.
Это функция, которая дает мне ошибка времени выполнения:
struct CEC_call des_CEC_call(char * buffy){
char request = buffy[0]; // fails here
buffy+=4;
char obligation = buffy[1];
buffy+=4;
struct CEC_call ceccall;
pepcall.request = request;
pepcall.obligation = obligation;
return ceccall;
}
Но если я изменяю тип возвращаемого значения на void
, при запуске не возникает проблем:
void des_CEC_call(char * buffy){
char request = buffy[0]; // doesn't fail here
buffy+=4;
char obligation = buffy[1];
buffy+=4;
struct CEC_call ceccall;
pepcall.request = request;
pepcall.obligation = obligation;
}
Возврат работает также хорошо с любым из стандартные типы возврата.
Заголовок, в котором определена структура, включен в файл с функцией, хотя он все равно будет иметь значение sh, даже если структура определена в том же файле. Не уверен, как продолжить отладку, любая помощь приветствуется.
РЕДАКТИРОВАТЬ:
Более подробная информация, основанная на предложениях из комментариев:
Я перезапустил ту же программу на моей ма c, а также некоторые другие архитектуры без рук с docker, и он работает без каких-либо заметных проблем. Некоторые аспекты, относящиеся к сдвигу битов, немного отличаются от ожидаемых, но не имеют ошибки времени выполнения из-за ошибки сегментации. Я пытался запустить его с различными уровнями оптимизации, но безрезультатно.
Ранее я использовал GDB, поэтому подумал, что это может дать некоторое представление, к сожалению, я не смог заставить его работать с этим контейнером.
Я убедился, что GDB установлен, и перекомпилировал двоичный файл с -0g
.
я пробежал docker с --cap-add=SYS_PTRACE
и --security-opt seccomp=unconfined
.
Каждый раз, когда я получаю:
warning: Could not trace the inferior process.
Error:
warning: ptrace: Function not implemented
During startup program exited with code 127.
Я могу без проблем использовать GDB с другими не 32-битными docker изображениями, не имеющими руки. Я думаю, что этого достаточно для другого вопроса, так как я потратил целую вечность, пытаясь заставить GDB работать с этой средой.
Я не совсем уверен, как проверить иначе, но я распечатал адрес buffy
указывает и значение buffy[0]
в предыдущих функциях, а также проблемная c единица.
Без возврата структуры:
address of buffy = 0xff58b9ec
buffer[0] = ff
address of buffy = 0xff58b9ec
buffer[0] = ff
address of buffy = 0xff58b9ec
buffer[0] = ff
С возвращением структуры:
address of buffy = 0xff58b9ec
buffer[0] = ff
address of buffy = 0xff58b9ec
buffer[0] = ff
address of buffy = (nil)
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Структура CEC_call
не имеет других полей. Это может быть где-то переполнение буфера, но я не создал ни одного буфера, по крайней мере, ни одного. Я раньше не использовал QEMU IIR C или valingrad, но рассмотрим их более подробно. Я не могу протестировать nateively в настоящее время, поскольку у меня нет доступа к предполагаемому встроенному linux.