单步指令区别step next stepi nexti

https://blog.csdn.net/weixin_43092232/article/details/106243657

https://blog.csdn.net/www_dong/article/details/117374370

 

代码验证:

龙芯3A5000验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
$ cat test.c
#include<stdio.h>
int  add ( int d1, int d2 )
{
  int d;
  d = d1 + 1;
  d = d + d2 + 2;
  return d;
}
 
int  add1 ( int d1, int d2 )
{
  int d;
  d = d1 + 10;
  d = d + d2 + 20;
  return d;
}
 
int main()
{
   int a = 0, b = 0;
   a = b + 1;
   a = add(a, b);
   a = a + 10;
   b = add1(a, b);
   b = a + b;
   return 1;
}
桌面20.3系统
lihui@lihui-pc:~/community/build$ gcc -v
 
gcc version 8.3.0 (Loongnix 8.3.0-6.lnd.vec.33)
 
lihui@lihui-pc:~/community/build$ gdb/gdb -v
 
GNU gdb (GDB) 14.0.50.20230705-git
 
 
 
lihui@lihui-pc:~/community/build$ gcc -g test.c -o test
lihui@lihui-pc:~/community/build$ objdump -d test
 
00000001200006d0 <add>:
   1200006d0:   02ff4063    addi.d  $r3,$r3,-48(0xfd0)
   1200006d4:   29c0a076    st.d    $r22,$r3,40(0x28)
   1200006d8:   02c0c076    addi.d  $r22,$r3,48(0x30)
   1200006dc:   0015008d    move    $r13,$r4
   1200006e0:   001500ac    move    $r12,$r5
   1200006e4:   004081ad    slli.w  $r13,$r13,0x0
   1200006e8:   29bf72cd    st.w    $r13,$r22,-36(0xfdc)
   1200006ec:   0040818c    slli.w  $r12,$r12,0x0
   1200006f0:   29bf62cc    st.w    $r12,$r22,-40(0xfd8)
   1200006f4:   28bf72cc    ld.w    $r12,$r22,-36(0xfdc)
   1200006f8:   0280058c    addi.w  $r12,$r12,1(0x1)
   1200006fc:   29bfb2cc    st.w    $r12,$r22,-20(0xfec)
   120000700:   28bfb2cd    ld.w    $r13,$r22,-20(0xfec)
   120000704:   28bf62cc    ld.w    $r12,$r22,-40(0xfd8)
   120000708:   001031ac    add.w   $r12,$r13,$r12
   12000070c:   0280098c    addi.w  $r12,$r12,2(0x2)
   120000710:   29bfb2cc    st.w    $r12,$r22,-20(0xfec)
   120000714:   28bfb2cc    ld.w    $r12,$r22,-20(0xfec)
   120000718:   00150184    move    $r4,$r12
   12000071c:   28c0a076    ld.d    $r22,$r3,40(0x28)
   120000720:   02c0c063    addi.d  $r3,$r3,48(0x30)
   120000724:   4c000020    jirl    $r0,$r1,0
 
0000000120000728 <add1>:
   120000728:   02ff4063    addi.d  $r3,$r3,-48(0xfd0)
   12000072c:   29c0a076    st.d    $r22,$r3,40(0x28)
   120000730:   02c0c076    addi.d  $r22,$r3,48(0x30)
   120000734:   0015008d    move    $r13,$r4
   120000738:   001500ac    move    $r12,$r5
   12000073c:   004081ad    slli.w  $r13,$r13,0x0
   120000740:   29bf72cd    st.w    $r13,$r22,-36(0xfdc)
   120000744:   0040818c    slli.w  $r12,$r12,0x0
   120000748:   29bf62cc    st.w    $r12,$r22,-40(0xfd8)
   12000074c:   28bf72cc    ld.w    $r12,$r22,-36(0xfdc)
   120000750:   0280298c    addi.w  $r12,$r12,10(0xa)
   120000754:   29bfb2cc    st.w    $r12,$r22,-20(0xfec)
   120000758:   28bfb2cd    ld.w    $r13,$r22,-20(0xfec)
   12000075c:   28bf62cc    ld.w    $r12,$r22,-40(0xfd8)
   120000760:   001031ac    add.w   $r12,$r13,$r12
   120000764:   0280518c    addi.w  $r12,$r12,20(0x14)
   120000768:   29bfb2cc    st.w    $r12,$r22,-20(0xfec)
   12000076c:   28bfb2cc    ld.w    $r12,$r22,-20(0xfec)
   120000770:   00150184    move    $r4,$r12
   120000774:   28c0a076    ld.d    $r22,$r3,40(0x28)
   120000778:   02c0c063    addi.d  $r3,$r3,48(0x30)
   12000077c:   4c000020    jirl    $r0,$r1,0
 
0000000120000780 <main>:
   120000780:   02ff8063    addi.d  $r3,$r3,-32(0xfe0)
   120000784:   29c06061    st.d    $r1,$r3,24(0x18)
   120000788:   29c04076    st.d    $r22,$r3,16(0x10)
   12000078c:   02c08076    addi.d  $r22,$r3,32(0x20)
   120000790:   29bfb2c0    st.w    $r0,$r22,-20(0xfec)
   120000794:   29bfa2c0    st.w    $r0,$r22,-24(0xfe8)
   120000798:   28bfa2cc    ld.w    $r12,$r22,-24(0xfe8)
   12000079c:   0280058c    addi.w  $r12,$r12,1(0x1)
   1200007a0:   29bfb2cc    st.w    $r12,$r22,-20(0xfec)
   1200007a4:   28bfa2cd    ld.w    $r13,$r22,-24(0xfe8)
   1200007a8:   28bfb2cc    ld.w    $r12,$r22,-20(0xfec)
   1200007ac:   001501a5    move    $r5,$r13
   1200007b0:   00150184    move    $r4,$r12
   1200007b4:   57ff1fff    bl  -228(0xfffff1c) # 1200006d0 <add>
   1200007b8:   0015008c    move    $r12,$r4
   1200007bc:   29bfb2cc    st.w    $r12,$r22,-20(0xfec)
   1200007c0:   28bfb2cc    ld.w    $r12,$r22,-20(0xfec)
   1200007c4:   0280298c    addi.w  $r12,$r12,10(0xa)
   1200007c8:   29bfb2cc    st.w    $r12,$r22,-20(0xfec)
   1200007cc:   28bfa2cd    ld.w    $r13,$r22,-24(0xfe8)
   1200007d0:   28bfb2cc    ld.w    $r12,$r22,-20(0xfec)
   1200007d4:   001501a5    move    $r5,$r13
   1200007d8:   00150184    move    $r4,$r12
   1200007dc:   57ff4fff    bl  -180(0xfffff4c) # 120000728 <add1>
   1200007e0:   0015008c    move    $r12,$r4
   1200007e4:   29bfa2cc    st.w    $r12,$r22,-24(0xfe8)
   1200007e8:   28bfa2cd    ld.w    $r13,$r22,-24(0xfe8)
   1200007ec:   28bfb2cc    ld.w    $r12,$r22,-20(0xfec)
   1200007f0:   001031ac    add.w   $r12,$r13,$r12
   1200007f4:   29bfa2cc    st.w    $r12,$r22,-24(0xfe8)
   1200007f8:   0280040c    addi.w  $r12,$r0,1(0x1)
   1200007fc:   00150184    move    $r4,$r12
   120000800:   28c06061    ld.d    $r1,$r3,24(0x18)
   120000804:   28c04076    ld.d    $r22,$r3,16(0x10)
   120000808:   02c08063    addi.d  $r3,$r3,32(0x20)
   12000080c:   4c000020    jirl    $r0,$r1,0
 
 
 
验证next
 
lihui@lihui-pc:~/community/build$ gdb/gdb test
...
(gdb) start
Temporary breakpoint 1 at 0x120000790: file test.c, line 20.
Starting program: /home/lihui/community/build/test
 
Temporary breakpoint 1, main () at test.c:20
20     int a = 0, b = 0;
(gdb) l
15    return d;
16  }
17 
18  int main()
19  {
20     int a = 0, b = 0;
21     a = b + 1;
22     a = add(a, b);
23     a = a + 10;
24     b = add1(a, b);
(gdb) next
21     a = b + 1;
(gdb) next
22     a = add(a, b);
(gdb) next
23     a = a + 10;
(gdb) next
24     b = add1(a, b);
(gdb) next
25     b = a + b;
(gdb) next
26     return 1;
(gdb) next
27  }
...
 
 
验证step
 
lihui@lihui-pc:~/community/build$ gdb/gdb test
...
(gdb) start
..
Temporary breakpoint 1, main () at test.c:20
20     int a = 0, b = 0;
(gdb) step
21     a = b + 1;
(gdb) step
22     a = add(a, b);
(gdb) step
add (d1=1, d2=0) at test.c:5
5     d = d1 + 1;
(gdb) step
6     d = d + d2 + 2;
(gdb) step
7     return d;
(gdb) step
8   }
(gdb) step
main () at test.c:23
23     a = a + 10;
(gdb) step
24     b = add1(a, b);
(gdb) step
add1 (d1=14, d2=0) at test.c:13
13    d = d1 + 10;
(gdb) step
14    d = d + d2 + 20;
(gdb) step
15    return d;
(gdb) step
16  }
(gdb) step
main () at test.c:25
25     b = a + b;
(gdb) step
26     return 1;
(gdb) step
27  }
 
 
可以看到next命令遇到函数不进入,step遇到函数进入,符合预期。
 
验证nexti
 
lihui@lihui-pc:~/community/build$ gdb/gdb test
...
(gdb) start
Temporary breakpoint 1 at 0x120000790: file test.c, line 20.
Starting program: /home/lihui/community/build/test
 
Temporary breakpoint 1, main () at test.c:20
20     int a = 0, b = 0;
(gdb) nexti
20     int a = 0, b = 0;
(gdb) nexti
21     a = b + 1;
(gdb) nexti
0x000000012000079c  21     a = b + 1;
(gdb) nexti
0x00000001200007a0  21     a = b + 1;
(gdb) nexti
22     a = add(a, b);
(gdb) nexti
0x00000001200007a8  22     a = add(a, b);
(gdb) nexti
0x00000001200007ac  22     a = add(a, b);
(gdb) nexti
0x00000001200007b0  22     a = add(a, b);
(gdb) nexti
0x00000001200007b4  22     a = add(a, b);
(gdb) nexti
0x00000001200007b8  22     a = add(a, b);
(gdb) nexti
0x00000001200007bc  22     a = add(a, b);
(gdb) nexti
23     a = a + 10;
(gdb) nexti
0x00000001200007c4  23     a = a + 10;
(gdb) nexti
0x00000001200007c8  23     a = a + 10;
(gdb) nexti
24     b = add1(a, b);
(gdb) nexti
0x00000001200007d0  24     b = add1(a, b);
(gdb) nexti
0x00000001200007d4  24     b = add1(a, b);
(gdb) nexti
0x00000001200007d8  24     b = add1(a, b);
(gdb) nexti
0x00000001200007dc  24     b = add1(a, b);
(gdb) nexti
0x00000001200007e0  24     b = add1(a, b);
(gdb) nexti
0x00000001200007e4  24     b = add1(a, b);
(gdb) nexti
25     b = a + b;
(gdb) nexti
0x00000001200007ec  25     b = a + b;
(gdb) nexti
0x00000001200007f0  25     b = a + b;
(gdb) nexti
0x00000001200007f4  25     b = a + b;
(gdb) nexti
26     return 1;
(gdb) nexti
27  }
 
nexti是逐条指令执行,但是没有进入到add和add1函数,跳过了这两个函数继续执行下面的指令。
 
 
验证stepi
lihui@lihui-pc:~/community/build$ gdb/gdb test
...
(gdb) start
Temporary breakpoint 1 at 0x120000790: file test.c, line 20.
Starting program: /home/lihui/community/build/test
 
Temporary breakpoint 1, main () at test.c:20
20     int a = 0, b = 0;
(gdb) next
21     a = b + 1;
(gdb) next
22     a = add(a, b);
(gdb) stepi
0x00000001200007a8  22     a = add(a, b);
(gdb) stepi
0x00000001200007ac  22     a = add(a, b);
(gdb) stepi
0x00000001200007b0  22     a = add(a, b);
(gdb) stepi
0x00000001200007b4  22     a = add(a, b);
(gdb) stepi
add (d1=0, d2=0) at test.c:3
3   {
(gdb) stepi
0x00000001200006d4  3   {
(gdb) stepi
0x00000001200006d8  3   {
(gdb) stepi
0x00000001200006dc  3   {
(gdb) stepi
0x00000001200006e0  3   {
(gdb) stepi
0x00000001200006e4  3   {
(gdb) stepi
0x00000001200006e8  3   {
(gdb) stepi
0x00000001200006ec  3   {
(gdb) stepi
0x00000001200006f0  3   {
(gdb) stepi
5     d = d1 + 1;
(gdb) stepi
0x00000001200006f8  5     d = d1 + 1;
(gdb) stepi
0x00000001200006fc  5     d = d1 + 1;
(gdb) stepi
6     d = d + d2 + 2;
(gdb) stepi
0x0000000120000704  6     d = d + d2 + 2;
(gdb) stepi
0x0000000120000708  6     d = d + d2 + 2;
(gdb) stepi
6     d = d + d2 + 2;
(gdb) stepi
0x0000000120000710  6     d = d + d2 + 2;
(gdb) stepi
7     return d;
(gdb) stepi
8   }
(gdb) next
main () at test.c:23
23     a = a + 10;
(gdb) next
24     b = add1(a, b);
(gdb) stepi
0x00000001200007d0  24     b = add1(a, b);
(gdb) stepi
0x00000001200007d4  24     b = add1(a, b);
(gdb) stepi
0x00000001200007d8  24     b = add1(a, b);
(gdb) stepi
0x00000001200007dc  24     b = add1(a, b);
(gdb) stepi
add1 (d1=1, d2=0) at test.c:11
11  {
(gdb) stepi
0x000000012000072c  11  {
(gdb) stepi
0x0000000120000730  11  {
(gdb) stepi
0x0000000120000734  11  {
(gdb) stepi
0x0000000120000738  11  {
(gdb) stepi
0x000000012000073c  11  {
(gdb) stepi
0x0000000120000740  11  {
(gdb) stepi
0x0000000120000744  11  {
(gdb) stepi
0x0000000120000748  11  {
(gdb) stepi
13    d = d1 + 10;
(gdb) stepi
0x0000000120000750  13    d = d1 + 10;
(gdb) stepi
0x0000000120000754  13    d = d1 + 10;
(gdb) stepi
14    d = d + d2 + 20;
(gdb) stepi
0x000000012000075c  14    d = d + d2 + 20;
(gdb) stepi
0x0000000120000760  14    d = d + d2 + 20;
(gdb) stepi
14    d = d + d2 + 20;
(gdb) stepi
0x0000000120000768  14    d = d + d2 + 20;
(gdb) stepi
15    return d;
(gdb) stepi
16  }
(gdb) next
main () at test.c:25
25     b = a + b;
(gdb) next
26     return 1;
(gdb) next
27  }
 
可以看到stepi也是逐条指令执行,会进入到函数add和add1内部执行,符合预期

  

posted on   lh03061238  阅读(101)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2020-10-10 QObject: Cannot create children for a parent that is in a different thread
2020-10-10 QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread问题

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示