2010-09-11 23 views
6

Tôi muốn ghi lại giá trị của biến cục bộ, t, mỗi lần chương trình đạt đến một dòng nhất định. Theo đó, tôi đã cố gắng:gdb: Ý nghĩa của lỗi tstart "Bạn không thể làm điều đó khi mục tiêu của bạn là` exec '"

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

nhưng các thông báo lỗi "Bạn không thể làm điều đó khi mục tiêu của bạn là 'exec '" và "Bạn không thể làm điều đó khi mục tiêu của bạn là 'con'" không hữu ích với tôi. Những lỗi này có ý nghĩa gì?

+0

Tại sao bạn muốn sử dụng 'trace' trên một chương trình địa phương? Nếu mục tiêu của bạn là thực hiện lệnh breakpoint + nhanh hơn, có vẻ như không thay thế hiện tại, nhưng có thể trong tương lai với chức năng tiêm mã được đề xuất: http://stackoverflow.com/a/31712150/895245 –

Trả lời

14

The tracepoint facility is currently available only for remote targets.

Bạn sẽ có thể thực hiện các thí nghiệm tracing mà bạn mong muốn bằng cách sử dụng gdbserver. Ví dụ:

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

Trong một cửa sổ khác:

$ 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 thí nghiệm tại thu thập các dữ liệu ...

+0

Nó cũng sẽ được mát mẻ để giải thích lý do tại sao nó chỉ có sẵn cho 'từ xa'. Tôi đoán nó không phải là một cái gì đó với sự hỗ trợ phần cứng, mà tồn tại chỉ để giảm tắc nghẽn băng thông của nhiều điểm ngắt trả lại quyền kiểm soát cho GDB. –

0

tốt nhất tôi có thể tìm thấy là

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

tải filename Tùy thuộc vào những gì gỡ lỗi từ xa cơ sở vật chất được cấu hình vào gdb, lệnh tải có thể có sẵn. Nơi nó tồn tại, nó có nghĩa là để làm cho tên tập tin (một thực thi) có sẵn cho gỡ lỗi trên hệ thống từ xa — tải xuống hoặc liên kết động, cho ví dụ . tải cũng ghi lại bảng biểu tượng tên tệp trong gdb, như lệnh thêm-symbol-file .

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

thông báo lỗi “Bạn không thể làm điều đó khi mục tiêu của bạn là ...”

The file is loaded at whatever address is specified in the 

thực thi. Đối với một số tệp đối tượng có định dạng , bạn có thể chỉ định địa chỉ tải khi bạn liên kết chương trình; cho các định dạng khác, như a.out, đối tượng định dạng tệp chỉ định địa chỉ cố định.

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

chương trình vào bộ nhớ flash.

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

Chúng ta đều biết cách sử dụng Google. Bạn có thể muốn không cung cấp câu trả lời mà không thực sự trả lời bất cứ điều gì :-) –

Các vấn đề liên quan