qemu: необработанный целевой сигнал 11 (ошибка сегментации) - ядро ​​сбрасывается при попытке вернуть структуру - PullRequest
1 голос
/ 30 января 2020

Я только что заметил, что не могу получить функцию, возвращающую структуру.
Я запускаю это на 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.

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Моя проблема заключалась в том, что заголовок файла, который получил объявление функции struct CEC_call des_CEC_call(char * buffy), не был включен в вызывающий файл.

Вызванная функция работала нормально, если она возвращала стандартные типы или void, но с пользовательским возвращением структуры указатель массива был обнулен. Этот вид сбил меня с толку изначально, так как я не думал, что он скомпилируется из-за отсутствия объявления, и эта ошибка сегментации произошла только на архитектуре arm32, я не получил этот cra sh на OSX.

1 голос
/ 03 февраля 2020
struct CEC_call ceccall;
pepcall.request     = request;
pepcall.obligation  =   obligation;

Кажется, у вас несоответствие имен ваших переменных: ceccall и pepcall, и вы возвращаете неинициализированную переменную ceccall.

...