почему ptrace singlestep возвращает слишком большое количество инструкций при статической компоновке?

Итак, я уже читал эту статью Счет машинных инструкций процесс с использованием PTRACE_SINGLESTEP, и я понимаю, что динамическое связывание тестовой программы с моей программой ptrace вернет количество инструкций, которое также учитывает инициализацию библиотеки времени выполнения. Тем не менее, я пытаюсь получить действительный счет для своей тестовой программы, а именно:

int main(){
    return 0;
}

Моя программа ptrace сначала также вернула более 90 тысяч значений, поэтому я изменил ее на статическую компоновку используемой тестовой программы. Счетчик теперь меньше, но все равно больше 12к. Программа, которую я использовал для подсчета инструкций:

#include <sys/ptrace.h>
#include <unistd.h>
#include <stdio.h>

int main() {
long long counter = 1;          // machine instruction counter
int wait_val;           // child's return value
int pid;                    // child's process id
int dat;    

switch (pid = fork()) {     // copy entire parent space in child
case -1:    perror("fork");
        break;

case 0:         // child process starts
        ptrace(PTRACE_TRACEME,0,NULL,NULL);     
        /* 
           must be called in order to allow the
           control over the child process and trace me (child)
           0 refers to the parent pid
        */

        execl("./returntestprog","returntestprog",NULL);    
        /* 
           executes the testprogram and causes
           the child to stop and send a signal
           to the parent, the parent can now
           switch to PTRACE_SINGLESTEP
        */
        break;
        // child process ends
default:    // parent process starts
        wait(&wait_val);                
        if (ptrace(PTRACE_SINGLESTEP, pid, 0, 0) != 0)
                            perror("ptrace");
                        /* 
                            switch to singlestep tracing and 
                            release child
                            if unable call error.
                         */
                    wait(&wait_val);
                // parent waits for child to stop at next 
                // instruction (execl()) 
                while (wait_val == 1407) {
                        counter++;
                        if (ptrace(PTRACE_SINGLESTEP, pid, 0, 0) != 0)
                                perror("ptrace");
                        /* 
                            switch to singlestep tracing and 
                            release child
                            if unable call error.
                         */
                        wait(&wait_val);
                        // wait for next instruction to complete  */
                }
        /*
          continue to stop, wait and release until
          the child is finished; wait_val != 1407
          Low=0177L and High=05 (SIGTRAP)
        */
        }
    printf("Number of machine instructions : %lld\n", counter);
    return 0;
}   // end of switch

Любая помощь будет очень признательна, так как я не совсем уверен, работает ли она правильно или нет. Как только я начну это дело, я хочу поработать над временным анализом с помощью ptrace, но обо всем по порядку и попытаться подсчитать количество выполненных инструкций.

Благодарность!


person Imara    schedule 20.03.2013    source источник


Ответы (1)


Я уже вроде понял. Таким образом, даже при статической компоновке вашего кода вы пытаетесь предотвратить динамическую компоновку библиотек с вашей программой и, таким образом, их включение в ваш подсчет. Однако другая сторона этого заключается в том, что выполнение вашего файла или, в основном, вызов в операционной системе также требует огромного количества инструкций. Таким образом, в основном, пока количество инструкций является постоянным и одинаковым при тех же условиях, вы можете вычесть это количество (например, при использовании программы возврата 0) из вашей исходной программы, чтобы подсчитать реальное количество инструкций.

person Imara    schedule 02.04.2013
comment
Как удался ваш проект? Вы публиковали что-нибудь об этом? - person Andrew Wagner; 17.09.2015