2013-11-19 2 views
2

Отслеживание точки отслеживается, но действия трассировки не работают нормально. на последней стороне gdb ниже показано, что точка трассировки прослеживается. , но «собирать $ regs» не работает должным образом.Действие gdb tracepoint не работает

моя платформа RH6.4.

1. сторона gdbserver.

gdbserver :10000 ./a.out 
Process ./a.out created; pid = 10466 
Listening on port 10000 
Remote debugging from host 127.0.0.1 

2. GDB сторона.

gdb a.out 
(gdb) target remote :10000 
Remote debugging using :10000 
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done. 

Loaded symbols for /lib64/ld-linux-x86-64.so.2 
0x00000033b7000b00 in _start() from /lib64/ld-linux-x86-64.so.2 
Created trace state variable $trace_timestamp for target's variable 1. 
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.107.el6.x86_64 


(gdb) trace main 
Tracepoint 1 at 0x400541: file a.c, line 12. 

(gdb) actions 1 
collect $regs 
end 

(gdb) tstart 

(gdb) break 15 
Breakpoint 2 at 0x40055f: file a.c, line 15. 
Breakpoint 2, main (argc=1, argv=0x7fffca819f08) at a.c:18 
18    sleep (1); 

(gdb) cont 
Continuing. 

(gdb) tstop 
(gdb) tfind 
Found trace frame 0, tracepoint 1 
12   c = 2; 
+0

Что вы подразумеваете под «" collect $ regs "не работает должным образом". –

+0

Когда трассировка 1 ударяется, $ regs следует сбрасывать «собирать $ regs». $ Regs - это разные регистры x86. поскольку никакие регистры x86 не сбрасываются, поэтому я предполагаю, что «собирать $ regs» не работает должным образом. – huiming

+0

@huiming Пожалуйста, проверьте мое обновление на мой собственный ответ, но, просто подведя итоги, как только вы вызвали 'tfind', чтобы сбросить всю собранную информацию, вы должны называть' tdump' – jcm

ответ

1

Я полагаю, вы ожидали точки трассировки, чтобы быть в реальной main строки объявления в исходном файле, я не права?

Важной частью является то, что она находится в точке входа функции, это, собственно, первая функция код с линии, что, глядя на предоставленную Вами информацию, она должна быть c = 2;

С другой стороны, это просто глупая деталь, пожалуйста, обратите внимание, что у вас нет кода в строке 15 и контрольная точка была установлена ​​на уровне линии 18.

Edit:

в соответствии с вашими комментариями, вы ожидали tfind сбросить все собранные регистры, но вы бы для этого необходимо сделать дополнительный шаг: используя tfind без аргументов вы выбрали следующую контрольную точку (сначала в этом случае), и для того, чтобы сбросить эту информацию о контрольной точке, вы должны позвонить tdump

+0

Мне все равно, где точка трассировки, моя цель - проверить, может ли функция gdb'trace работать или нет, как ожидалось. Поэтому для меня достаточно одной точки следа, независимо от того, какая линия.
Для пустого разрыва строки, я думаю, что это не влияет на мою цель тестирования, точка прерывания позже, чем точка трассировки, достаточно для меня. – huiming

Смежные вопросы