Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

gdb: Meaning of tstart error "You can't do that when your target is `exec'"

I would like to record the value of a local variable, t, each time that the program reaches a certain line. Accordingly, I tried:

(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'

but the error messages "You can't do that when your target is `exec'" and "You can't do that when your target is `child'" are not helpful to me. What do these errors mean?

like image 433
Daniel Trebbien Avatar asked Sep 11 '10 14:09

Daniel Trebbien


1 Answers

The tracepoint facility is currently available only for remote targets.

You should be able to perform the tracing experiment you desire by using gdbserver. Example:

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

In another window:

$ 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

Tracing experiment now collects the data ...

like image 178
Employed Russian Avatar answered Oct 22 '22 14:10

Employed Russian