Полагаю, номера строк связаны с текущим значением eip, верно?
РЕШЕНИЕ 1:
Затем вы можете использовать что-то вроде GetThreadContext () , за исключением того, что вы работаете в Linux. Я немного погуглил и нашел что-то похожее, ptrace () :
Системный вызов ptrace () предоставляет
средства, с помощью которых родительский процесс может
наблюдать и контролировать выполнение
другой процесс, и изучить и
изменить его основной образ и регистры. [...]
Родитель может инициировать трассировку
вызывая fork (2) и имея
В результате ребенок делает PTRACE_TRACEME,
сопровождаемый (обычно) exec (3).
Кроме того, родитель может начать
след существующего процесса с использованием
PTRACE_ATTACH.
Теперь я подумал, что вы можете создать «основную» программу, которая проверяет сигналы, посылаемые его дочернему элементу, настоящую программу, над которой вы работаете. после fork()
он вызывает waitid () :
Все эти системные вызовы используются для
ждать изменения состояния у ребенка
вызывающий процесс, и получить
информация о ребенке, чей
состояние изменилось.
и, если SIGSEGV (или что-то подобное) перехватывается, звоните ptrace()
, чтобы получить значение eip
.
PS: я никогда не использовал эти системные вызовы (ну, на самом деле, я никогда не видел их раньше;), поэтому я не знаю, возможно ли это, и не может помочь вам. По крайней мере, я надеюсь, что эти ссылки полезны. ;)
РЕШЕНИЕ 2:
Первое решение довольно сложное, верно? Я придумал гораздо более простую: используя signal () , поймайте интересующие вас сигналы и вызовите простую функцию, которая читает значение eip
, хранящееся в стеке:
...
signal(SIGSEGV, sig_handler);
...
void sig_handler(int signum)
{
int eip_value;
asm {
push eax;
mov eax, [ebp - 4]
mov eip_value, eax
pop eax
}
// now you have the address of the
// **next** instruction after the
// SIGSEGV was received
}
Этот asm-синтаксис принадлежит Borland, просто измените его на GAS
. ;)