附加正在运行的进程时,GDB -break 命令不起作用

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

附加正在运行的进程时,GDB -break 命令不起作用

这是一个例子

c++

#include <iostream>
#include <thread>
#include <chrono>

int main()
{
    int i = 0;
    int m = 0;
    while (i < 100000)
    {
        i++;
        if (i % 2 == 0)
        {
            m++;
        }
        // sleep(1);
        std::this_thread::sleep_for(std::chrono::seconds(1));

        std::cout << "m: " << m << ", i: " << i << std::endl;

        if (m > 100 && i == 100)
        {
            break;
        }
    }

    std::cout << "end m: " << m << ", i: " << i << std::endl;
    return m;
}

gdb 命令

gdb -p $(pidof ./test_condiction_breakpoint) --batch -ex "interpreter-exec mi '-break-insert -c \"m == 10\" -f test_condiction_breakpoint.cc:21'" -ex "interpreter-exec mi '-break-after 1 1'" -ex "interpreter-exec mi '-break-commands 1 \"silent\" \"set var m=1001\" \"set var i=100\"  \"cont\"'" -ex "interpreter-exec mi 'set follow-fork-mode parent'" -ex "interpreter-exec mi '-break-list'" -ex "interpreter-exec mi '-exec-continue'"

在这种情况下,gdb 中断命令不起作用,有人可以帮助我吗?

gdb
1个回答
0
投票

它似乎在这里工作:

$ gdb -v
GNU gdb (Ubuntu 12.1-0ubuntu1~22.04) 12.1

请注意,必须启用调试 (

-g
) 才能使断点起作用。

$ g++ -g t.cpp -o t
$ ./t

我的 Ubuntu 需要

sudo
附加到正在运行的进程。

$ sudo gdb -p $(pidof ./t) --batch -ex "interpreter-exec mi '-break-insert -c \"m == 10\" -f t.cpp:21'" -ex "interpreter-exec mi '-break-after 1 1'" -ex "interpreter-exec mi '-break-commands 1 \"silent\" \"set var m=1001\" \"set var i=100\"  \"cont\"'" -ex "interpreter-exec mi 'set follow-fork-mode parent'" -ex "interpreter-exec mi '-break-list'" -ex "interpreter-exec mi '-exec-continue'"
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
0x00007f87a8ae578a in __GI___clock_nanosleep (clock_id=clock_id@entry=0, flags=flags@entry=0, req=0x7ffdb6318d60, rem=0x7ffdb6318d60) at ../sysdeps/unix/sysv/linux/clock_nanosleep.c:78
78      ../sysdeps/unix/sysv/linux/clock_nanosleep.c: No such file or directory.
^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x0000560c8d42b2ef",func="main()",file="t.cpp",fullname="/tmp/tmp/t.cpp",line="21",thread-groups=["i1"],cond="m == 10",times="0",original-location="t.cpp:21"}
^done
^done
&"set follow-fork-mode parent\n"
^done
^done,BreakpointTable={nr_rows="1",nr_cols="6",hdr=[{width="7",alignment="-1",col_name="number",colhdr="Num"},{width="14",alignment="-1",col_name="type",colhdr="Type"},{width="4",alignment="-1",col_name="disp",colhdr="Disp"},{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},{width="18",alignment="-1",col_name="addr",colhdr="Address"},{width="40",alignment="2",col_name="what",colhdr="What"}],body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x0000560c8d42b2ef",func="main()",file="t.cpp",fullname="/tmp/tmp/t.cpp",line="21",thread-groups=["i1"],cond="m == 10",times="0",ignore="1",script={"silent","set var m=1001","set var i=100","cont"},original-location="t.cpp:21"}]}
^done
[Inferior 1 (process 1426754) exited with code 0351]

程序输出为:

$ ./t
m: 0, i: 1
m: 1, i: 2
m: 1, i: 3
m: 2, i: 4
m: 2, i: 5
m: 3, i: 6
m: 3, i: 7
m: 4, i: 8
m: 4, i: 9
m: 5, i: 10
m: 5, i: 11
m: 6, i: 12
m: 6, i: 13
m: 7, i: 14
m: 7, i: 15
m: 8, i: 16
m: 8, i: 17
m: 9, i: 18
m: 9, i: 19
m: 10, i: 20
m: 10, i: 21
end m: 1001, i: 100

你的源文件真的叫

test_condiction_breakpoint.cc
吗?

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