如何在 GDB 中使用结构化绑定单步执行 C++ 代码而不跳转到声明行?

问题描述 投票:0回答:1

给定一个程序:

[]$ cat a.cpp
#include <iostream>

int main(){
    auto [a, b] = std::make_pair(1, 2);
    for(int x = 0; x < 2; ++x) {
        a += b;
        b += x;
    }
}

如果我编译它并在 GDB 中逐行执行它:

[]$ g++ -std=c++17 -g a.cpp
[]$ gdb -q a.out
Reading symbols from a.out...
(gdb) break main
Breakpoint 1 at 0x114d: file a.cpp, line 4.
(gdb) run
Starting program: /tmp/a.out 

Breakpoint 1, main () at a.cpp:4
4       auto [a, b] = std::make_pair(1, 2);
(gdb) next
5       for(int x = 0; x < 2; ++x) {
(gdb) 
4       auto [a, b] = std::make_pair(1, 2);
(gdb) 
6           a += b;
(gdb) 
4       auto [a, b] = std::make_pair(1, 2);
(gdb) 
7           b += x;
(gdb) 
5       for(int x = 0; x < 2; ++x) {
(gdb) 
4       auto [a, b] = std::make_pair(1, 2);
(gdb) 
6           a += b;
(gdb) 
4       auto [a, b] = std::make_pair(1, 2);
(gdb) 
7           b += x;
(gdb) 
5       for(int x = 0; x < 2; ++x) {
(gdb) 
9   }

然后每次访问或写入变量时都会跳过结构化绑定声明行。

有什么方法可以让它不跨过这些线,期待第一次,类似于这样:

(gdb) run
Starting program: /tmp/a.out 

Breakpoint 1, main () at a.cpp:4
4       auto [a, b] = std::make_pair(1, 2);
(gdb) next
5       for(int x = 0; x < 2; ++x) {
(gdb) 
6           a += b;
(gdb) 
7           b += x;
(gdb) 
5       for(int x = 0; x < 2; ++x) {
(gdb) 
6           a += b;
(gdb) 
7           b += x;
(gdb) 
5       for(int x = 0; x < 2; ++x) {
(gdb) 
9   }

  • 可以将结构化绑定更改为
    auto& a = pair.first; auto& b = pair.second
    并且它可以正常工作,但这意味着根本不使用结构化绑定。
  • 在该行设置断点并输入命令
    commands | next | end
    并不完全有效,每个结构化绑定仍然需要手动工作。
  • 添加任何优化标志(甚至在本例中为
    -Og
    )都会优化整个代码(因为它没有任何可观察到的副作用);或者优化一些未使用的变量。
    然而,当有明显的副作用时,它确实有效。
  • 在线搜索“gdb 调试结构化绑定”,甚至“gdb 在单步执行时跳过特定行”不会给出任何有用的结果。
    skip
    命令只能跳过函数,不能跳过行。

工具版本:

[]$ g++ --version
g++ (Arch Linux 9.2.1+20200130-2) 9.2.1 20200130
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

[]$ gdb --version
GNU gdb (GDB) 9.1
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
c++ linux debugging gdb
1个回答
0
投票

这个问题有答案吗?我也遇到了同样的问题,但无法解决。

© www.soinside.com 2019 - 2024. All rights reserved.