【问题标题】:Can gdb print the contents of the buffer written to by the C write() function?gdb 可以打印由 C write() 函数写入的缓冲区的内容吗?
【发布时间】:2020-03-04 18:52:15
【问题描述】:

我有以下代码:

write(fd[1], user_id, sizeof(user_id));

是否可以使用 gdb 查看此命令写入的缓冲区的内容? 使用 x 或 print 只是给出内存地址,而不是该地址中缓冲区的内容。

(gdb) x write
0x7ffff7af4140 <__GI___libc_write>: 0xb1058d48

由于fd[1]指的是stdout,所以这个请求应该相当于检查stdout缓冲区的状态。

附加信息: user_id 是一个字符数组。 fd[1] 表示 write 正在写入标准输出(fd[0] 指的是标准输入)。 这是程序的第 44 行,我正在使用断点访问它。

【问题讨论】:

  • 你想看user_id?您使用的是哪个命令?请将此信息和输出添加到问题中
  • 添加了一些说明
  • 关于最新的编辑,你的意思是什么缓冲区?在read()write() 函数的术语中,在这种情况下,“缓冲区” user_id。文件描述符没有关联的数据缓冲区,或者至少没有文档记录。
  • 我明白了。我想看看文件描述符的缓冲区,在这种情况下它指向stdout,所以是stdout的缓冲区。 (我正在调试的根本问题是我连续产生 2 个写入调用,并且在一个单独的文件中产生了 2 个读取调用,但由于某种原因,只发生了一个事务,而不是 2 个 - 第一个写入调用由第一次读取。第二次读取不接受任何输入)

标签: c shell gdb pipe


【解决方案1】:

假设您对一个变量user_id 感兴趣,该变量位于程序myprogram 的文件myfile.c 的行44

write(fd[1], user_id, sizeof(user_id)); //line 44 of myfile.c

你必须执行这个:

gdb myprogram

在gdb中设置断点:

b myfile.c:44 

运行程序(执行此命令后将到达断点):

run

打印你的变量值:

p user_id

【讨论】:

  • 或者可以使用多种其他方式在gdb 中运行程序,直到调用感兴趣的write()。它不一定是该行上的断点,但这肯定会起作用。
  • 我注意到,然而,OP 可能意味着“实际写入的内容”与传递给write() 的数据不同。例如,他们可能希望确认 write() 确实按照指定的方式行事。
  • @JohnBollinger 我同意,但由于他提到了内容方面并且他只提供了变量的地址,我认为他对其内容感兴趣
  • 不完全是这样。我想打印 write 调用的结果 - 即查看由于调用而实际进入 stdout 缓冲区的内容。我将编辑我的帖子以使其更清晰
  • @Cheetaiean 你可以从捕获write返回的值开始(它返回写入的字节数(0表示不写入),如果失败则返回-1)
【解决方案2】:

似乎没有这样的 GDB 功能。

【讨论】:

    猜你喜欢
    • 2016-12-25
    • 2015-08-20
    • 1970-01-01
    • 2013-05-20
    • 2021-06-23
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 2015-07-08
    相关资源
    最近更新 更多