Изучите доступ к пользовательскому пространству без выравнивания только с помощью счетчика программ и исполняемого файла - PullRequest
1 голос
/ 07 июня 2011

Итак, у меня есть этот исполняемый файл, скомпилированный с параметрами -g, который запускает множество предупреждений о невыровненном доступе к пользовательскому пространству.

Unaligned userspace access in "softtest" pid=1407 pc=0x0041515c ins=0x011e
Unaligned userspace access in "softtest" pid=1406 pc=0x0041515c ins=0x011e
Unaligned userspace access in "softtest" pid=1406 pc=0x004148c2 ins=0x012e
Unaligned userspace access in "softtest" pid=1407 pc=0x0041515c ins=0x011e
Unaligned userspace access in "softtest" pid=1406 pc=0x0041515c ins=0x011e
Unaligned userspace access in "softtest" pid=1407 pc=0x0041515c ins=0x011e
Unaligned userspace access in "softtest" pid=1406 pc=0x004148c2 ins=0x012e
Unaligned userspace access in "softtest" pid=1407 pc=0x0041515c ins=0x011e
Unaligned userspace access in "softtest" pid=1406 pc=0x0041515c ins=0x011e
Unaligned userspace access in "softtest" pid=1406 pc=0x004148c2 ins=0x012e
Unaligned userspace access in "softtest" pid=1407 pc=0x0041515c ins=0x011e
Unaligned userspace access in "softtest" pid=1406 pc=0x0041515c ins=0x011e
Unaligned userspace access in "softtest" pid=1407 pc=0x0041515c ins=0x011e
Unaligned userspace access in "softtest" pid=1406 pc=0x004148c2 ins=0x012e

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

Я могу понюхать это как цикл, выполняющий некоторое копирование памяти или что-то в этом роде, поскольку адрес очень часто один и тот же.

Итак, вопрос: как я могу узнать, что это за файл и строка в моем коде, вызывающем этот невыровненный доступ, с помощью инструментов Linux?

Есть что-нибудь по этому поводу?

1 Ответ

2 голосов
/ 07 июня 2011

Посмотрите на утилиту addr2line

DESCRIPTION
       addr2line translates addresses into file names and line numbers.
       Given an address in an executable or an offset in a section of a
       relocatable object, it uses the debugging information
       to figure out which file name and line number are associated with it.

Простой пример c:

1 #include <stdio.h>
2 
3 int main() {
4     int* a = 0;
5 
6     printf("%d", *a);
7     return 0;
8 }

скомпилируйте его, используя

gcc -Wall -ggdb3 g.c

GDB даетэти выходные данные:

$ gdb -q  a.out 
Reading symbols from /tmp/tmp.M0766CSHGm/a.out...done.
(gdb) r
Starting program: /tmp/tmp.M0766CSHGm/a.out 

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400538 in main () at g.c:6
6       printf("%d", *a);

Использование этого адреса с addr2line:

$ addr2line 0x0000000000400538
/tmp/tmp.M0766CSHGm/g.c:6
...