Я пишу программу, которая использует как потоки ОС, так и пользовательские потоки (волокна, я написал эту пользовательскую программу Threading с переключением контекста на ассемблере). Проблема в том, что программа иногда заканчивается ошибкой сегментации, но иногда это не так.
Проблема связана с тем, что вызывается функция с недопустимыми аргументами, которые не должны вызываться. Я думаю, что обратная трассировка gdb не дает правильной информации. Вот вывод моей программы gdb
#0 0x0000000000000000 in ?? ()
#1 0x0000555555555613 in thread_entry (fn=0x0, arg=0x0) at userThread2.cpp:243
#2 0x000055555555c791 in start_thread () at contextSwitch2.s:57
#3 0x0000000000000000 in ?? ()
fn - это функция, которую я хочу запустить как пользовательский поток, arg - переданный аргументк этой функции. У меня есть функция Spawn в коде пользовательской библиотеки потоков, которая помещает два аргумента (fn и arg) и указатель на start_thread в стеке и, таким образом, вызывается start_thread, функция сборки, которая вызывает функцию c ++ thread_entry для вызова функции fnс аргументами arg.
Я не ожидаю вызова start_thread или thread_entry в точке ошибки, поэтому я не уверен, как вызывается start_thread. Даже если он вызывается, тогда Spawn () должен был вызвать start_thread, поскольку это единственная функция, которая вызывает start_thread. Но Spawn не отображается в gtb backtrace.
В некоторых онлайн-публикациях упоминается возможность повреждения стека или что-то подобное в результате ошибки, и они предписывают использование «record btrace pt». Я потратил много времени на настройку поддержки Intel Btrace PT в ядре / GDB, но я не смог настроить его, поэтому я не иду по этому пути.
Вот ссылка на мой код с инструкциями по компиляции:https://github.com/smartWaqar/userThreading