GDB: Значение ошибки tstart "Вы не можете сделать это, когда ваша цель" exec "" - PullRequest
6 голосов
/ 11 сентября 2010

Я бы хотел записать значение локальной переменной t каждый раз, когда программа достигает определенной строки.Соответственно, я попытался:

(gdb) trace stoer_wagner_min_cut.hpp :197
Tracepoint 1 at 0x4123a0: file ./boost/graph/stoer_wagner_min_cut.hpp, line 197.
(gdb) actions
Enter actions for tracepoint 1, one per line.
End with a line saying just "end".
> collect t
> end
(gdb) tstart
You can't do that when your target is `exec'
(gdb) break main
Breakpoint 2 at 0x401448: file time_stoer_wagner.cpp, line 50.
(gdb) run
Starting program: C:\Users\Daniel\Documents\projects\stoer_wagner_min_cut/time_stoer_wagner.exe
[New Thread 3908.0x39c]

Breakpoint 2, main () at time_stoer_wagner.cpp:50
50        std::ifstream ifs("prgen_500_50_2.txt");
(gdb) tstart
You can't do that when your target is `child'

, но появляются сообщения об ошибках "Вы не можете сделать это, когда ваша цель" exec "" и "Вы не можете сделать это, когда ваша цель" ребенок ""не полезно для меня.Что означают эти ошибки?

Ответы [ 2 ]

14 голосов
/ 11 сентября 2010

Средство трассировки в настоящее время доступно только для удаленных целей.

Вы сможете выполнить желаемый эксперимент по трассировке с помощью gdbserver.Пример:

$ gdbserver :0 ./a.out 
Process ./a.out created; pid = 21838
Listening on port 51596

В другом окне:

$ gdb -q ./a.out 
Reading symbols from /tmp/a.out...done.
(gdb) target remote :51596

0x00007fa76ec3fa60 in _start () from /lib64/ld-linux-x86-64.so.2
(gdb) list foo
1   int foo(int x)
2   {
3     return x;
4   }
5   
6   int main()
7   {
8     for(int i = 0; i < 10; ++i)
9       foo(i);
10    return 0;
11  }
(gdb) trace 3
Tracepoint 1 at 0x40053f: file t.c, line 3.
(gdb) actions
> collect x
> end
(gdb) c

Трассировочный эксперимент теперь собирает данные ...

0 голосов
/ 11 сентября 2010

Лучшее, что я мог найти, это

http://sources.redhat.com/gdb/current/onlinedocs/gdb.html

имя файла загрузки В зависимости от того, какие средства удаленной отладки сконфигурированы в gdb, может быть доступна команда загрузки.Там, где он существует, он предназначен для того, чтобы сделать имя файла (исполняемый файл) доступным для отладки в удаленной системе - например, путем загрузки или динамического связывания.load также записывает таблицу символов имени файла в gdb, например команду add-symbol-file.

If your gdb does not have a load command, attempting to execute it gets

сообщение об ошибке «Вы не можете сделать это, когда ваша цель ...»

The file is loaded at whatever address is specified in the

исполняемый файл.Для некоторых форматов объектных файлов вы можете указать адрес загрузки при связывании программы;для других форматов, таких как a.out, формат объектного файла указывает фиксированный адрес.

Depending on the remote side capabilities, gdb may be able to load

программ во флэш-памяти.

load does not repeat if you press <RET> again after using it.
...