Я смотрю на следующую трассировку программы, которую я отлаживаю в GDB:
Thread 7 (Thread 3983):
#0 0xf7737430 in __kernel_vsyscall ()
#1 0x41b85412 in __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S:142
#2 0x41b80d6d in _L_lock_686 () from libpthread.so.0
#3 0xfbad8001 in ?? ()
#4 0x080eac80 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
В частности, меня интересует адрес кадра 0xfbad8001 и его значение.
Платформа основана на x86, поэтому этот невыровненный адрес недействителен. Учитывая, что «плохой» закодирован в шестнадцатеричном значении, я предполагаю, что это магическое число, но до сих пор я не смог определить, кто устанавливает это значение и почему. Я попытался найти ядро и glibc в базе данных google и онлайн LXR, но не нашел ни одной строки кода, которая действительно устанавливала бы это значение.
Если я ищу в Google «fbad8001», то есть много обращений, показывающих этот адрес в обратных трассировках и дампах памяти. Таким образом, это конкретное значение, кажется, имеет какое-то значение, и я предполагаю, что это магическое число откуда-то, но до сих пор я не смог найти код, который его устанавливает.
Кто устанавливает это значение и что оно означает?
Ядро основано на Linux 3.4.10, а glibc — на 2.15.
Помимо исходного кода ядра и glibc, я также просмотрел исходный код gcc, gdb и binutils, но до сих пор не вижу никаких неопровержимых доказательств. Я не уверен, где еще искать.
0x41b80d6d
также является плохим (невыровненным) адресом. - person Paul R   schedule 28.05.2014