Как strace получает errno из неудачных системных вызовов в отслеживаемом процессе?
Например, если я делаю strace ls
, strace отображает символическое значение errno (например, ENOENT
) при сбое вызова. Я знаю, что под капотом strace используется ptrace.
Если я использую ptrace для отслеживания системных вызовов процессов, как я могу прочитать значение errno в отслеживаемом процессе?
В частности, как мне получить адрес errno в дочернем процессе, чтобы я мог прочитать его, используя PTRACE_PEEKDATA
или process_vm_readv
?
Спасибо
errno
— это концепция C (и при этом переменная для каждого потока), а не системная концепция. Значение, помещенное вerrno
, является отрицанием значения, возвращаемого системным вызовом. Вот почему это читается как RAX и почему это устанавливает RAX (при переопределении системного вызова). - person ikegami   schedule 12.03.2020rax
, но это не так. Программа, которую я написал, также правильно показывает, чтоrax
есть отрицаниеerrno
. Спасибо - person NotAPro   schedule 12.03.2020