gdb:tstart 错误的含义“当你的目标是‘exec’时你不能这样做”

Posted

技术标签:

【中文标题】gdb:tstart 错误的含义“当你的目标是‘exec’时你不能这样做”【英文标题】:gdb: Meaning of tstart error "You can't do that when your target is `exec'" 【发布时间】:2010-09-11 14:45:43 【问题描述】:

我想记录一个局部变量t 的值,每次程序到达某一行。因此,我尝试了:

(gdb) 跟踪 stoer_wagner_min_cut.hpp :197 0x4123a0 处的跟踪点 1:文件 ./boost/graph/stoer_wagner_min_cut.hpp,第 197 行。 (gdb) 行动 输入跟踪点 1 的操作,每行一个。 以一句“结束”结束。 > 收集 t > 结束 (gdb) 启动 当您的目标是“执行”时,您不能这样做 (gdb) 中断主要 0x401448 处的断点 2:文件 time_stoer_wagner.cpp,第 50 行。 (gdb) 运行 启动程序:C:\Users\Daniel\Documents\projects\stoer_wagner_min_cut/time_stoer_wagner.exe [新线程 3908.0x39c] 断点 2,main() 在 time_stoer_wagner.cpp:50 50 std::ifstream ifs("prgen_500_50_2.txt"); (gdb) 启动 当您的目标是“孩子”时,您不能这样做

但是错误消息“当你的目标是 `exec' 时你不能这样做”和“当你的目标是 `child' 时你不能这样做”对我没有帮助。这些错误是什么意思?

【问题讨论】:

为什么要在本地程序上使用trace?如果您的目标是让断点 + 命令更快,目前似乎没有替代方案,但未来可能会有建议的代码注入功能:***.com/a/31712150/895245 【参考方案1】:

The tracepoint facility is currently available only for remote targets.

您应该能够使用 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

Tracing Experiment 现在收集数据...

【讨论】:

解释一下为什么它只适用于remote 也很酷。我猜这不是硬件支持,它的存在只是为了减少将控制权返回给 GDB 的许多断点的带宽瓶颈。

以上是关于gdb:tstart 错误的含义“当你的目标是‘exec’时你不能这样做”的主要内容,如果未能解决你的问题,请参考以下文章

cuda-gdb:“CUDA_EXCEPTION_9:Warp Hardware Stack Overflow”的含义/出现

Boost Asio error_code 的错误值的含义

gdb调试关键点记录

gdb 管道重定向错误:(gdb) 在 fd 0 上检测到挂起

gcc编译过程中的各种参数含义

如何使用 gdb 和 core-dump 文件查找此分段错误的原因?(GDB 的限制)