单步指令区别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 2023-10-10 10:16 lh03061238 阅读(101) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!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问题