gpt4 book ai didi

c - 为什么GDB "step"进入标准库调用的机器语言?

转载 作者:太空宇宙 更新时间:2023-11-04 01:19:48 25 4
gpt4 key购买 nike

在我的一些系统上,当我调试非常简单的代码时,GDB 的行为与我预期的不同。在某些系统上,当我“步进”时,gdb 会“掩盖”标准库调用;在其他系统上,“步骤”深入到每个库调用的机器语言中。

首先,举一个我习惯于 GDB 的行为示例:

$ gdb ./testapp
GNU gdb (GDB) CentOS (7.0.1-45.el5.centos)
(...)
(gdb) break main
Breakpoint 1 at 0x80483b6: file testapp.c, line 6.
(gdb) run
Starting program: ./testapp

Breakpoint 1, main () at testapp.c:6
6 char str[] = {"Test string"};
(gdb) step
8 printf("String: %s\n", str );
(gdb)
String: Test string
9 printf("Len: %zu\n", strlen( str ));
(gdb)
Len: 11
10 return 0;
(gdb)

这是一个 GDB 逐步进入 printf() 到机器语言步骤的示例。

$ gdb ./testapp
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-92.el6)
(...)
(gdb) break main
Breakpoint 1 at 0x40050c: file testapp.c, line 6.
(gdb) run
Starting program: ./testapp

Breakpoint 1, main () at testapp.c:6
6 char str[] = {"Test string"};
(gdb) step
8 printf("String: %s\n", str );
(gdb)
__printf (format=0x400668 "String: %s\n") at printf.c:30
30 {
(gdb)
34 va_start (arg, format);
(gdb)
35 done = vfprintf (stdout, format, arg);
(gdb)
_IO_vfprintf_internal (s=0x383958f040, format=0x400668 "String: %s\n", ap=0x7fffffffe330) at vfprintf.c:236
236 int save_errno = errno;
(gdb)
201 {
(gdb)
236 int save_errno = errno;
(gdb)
1283 ORIENT;
(gdb)
1287 ARGCHECK (s, format);
(gdb)
1298 if (UNBUFFERED_P (s))
(gdb)
1309 __va_copy (ap_save, ap);
(gdb)
1320 f = lead_str_end = __find_specmb ((const UCHAR_T *) format);
(gdb)
__find_specmb (s=0x383958f040, format=0x400668 "String: %s\n", ap=0x7fffffffe330) at printf-parse.h:109
109 return (const unsigned char *) __strchrnul ((const char *) format, '%');
(gdb)
_IO_vfprintf_internal (s=0x383958f040, format=0x400668 "String: %s\n", ap=0x7fffffffe330) at vfprintf.c:1309
1309 __va_copy (ap_save, ap);
(gdb)
1320 f = lead_str_end = __find_specmb ((const UCHAR_T *) format);
(gdb)
__find_specmb (s=0x383958f040, format=0x400668 "String: %s\n", ap=0x7fffffffe330) at printf-parse.h:109
109 return (const unsigned char *) __strchrnul ((const char *) format, '%');
(gdb)
strchrnul () at ../sysdeps/x86_64/strchrnul.S:27
27 movd %esi, %xmm1
(gdb)
28 movq %rdi, %rcx
(gdb)
29 punpcklbw %xmm1, %xmm1
(gdb)

这是“testapp.c”的源代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(){
char str[] = {"Test string"};

printf("String: %s\n", str );
printf("Len: %zu\n", strlen( str ));
return 0;
}

程序在两种环境下编译如下:

cc -g -o testapp testapp.c

这是我在 Stack Overflow 上的第一个问题!任何帮助将不胜感激!谢谢!

最佳答案

您看不到“机器语言”。您会看到库的源代码。

在某些机器上,库显然安装了调试信息和源代码。在该机器上执行“步骤”将进入该过程。在另一台机器上,该库显然没有安装调试信息,因此“step”命令会跳过它。

注意:“step”命令在所有情况下都应该进入库。如果没有源代码,您应该会看到(真实的)机器语言。似乎 gdb 不这样做(VS 做)。

关于c - 为什么GDB "step"进入标准库调用的机器语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47204492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com