【问题标题】:Using Ptrace to find out what exactly does the arguments signify for a system call使用 Ptrace 找出参数对系统调用的确切含义
【发布时间】:2012-04-04 16:12:54
【问题描述】:

我已经发布了以下Question 得到了解决方案并继续前进
我正在使用 ptrace 来查找传递给系统调用的所有参数。
该程序正在获取我在 ebx、ecx、edx 中的值。现在对于一个开放的系统调用,我得到了 foll

SYSCALL 5: ebx :bf9748af ecx: 00008000 edx: 00000000 /open
系统调用 5:ebx:80485b3 ecx:00000242 edx:000001b6 /open

我使用了 strace,它神奇地将上面的内容转换成这样:

open("test.txt", O_RDONLY|O_LARGEFILE) = 3
open("test.txt", O_RDWR|O_CREAT|O_TRUNC, 0666) = 3

如何手动执行此操作?有什么地方可以找到 O_LARGEFILE 的值吗?
我搜索了很多,发现了this,但它并不具备一切。还尝试阅读 strace 代码,但没有遇到此转换的代码。
如果有人可以帮助我,那将对我非常有帮助。另外,如果您知道这是在 strace 中写的,我想看看它。提前致谢。

【问题讨论】:

  • 我阅读了man 2 open 并发现 open 执行按位或但我仍然没有得到完整的图片:(
  • 你又想做什么??
  • @UmNyobe:我想知道如何将242 值转换为O_RDWR | O_CREAT | O_TRUNC
  • @nos:在手册页中,它告诉我您可以使用哪些标志,例如O_RDWR 等,但是当这些在寄存器中传递时,值是长整数。 (ebx,ecx 中的值)等,我想将整数值解释为这些未提及的标志。
  • 我希望你知道这些值在 Linux 发行版中无论如何都没有标准化......

标签: c linux system-calls strace ptrace


【解决方案1】:

你可以从this header file读出这些值:

#define O_ACCMODE      0003
#define O_RDONLY         00
#define O_WRONLY         01
#define O_RDWR           02
#define O_CREAT        0100 /* not fcntl */
#define O_EXCL         0200 /* not fcntl */
#define O_NOCTTY       0400 /* not fcntl */
#define O_TRUNC       01000 /* not fcntl */
#define O_APPEND      02000
#define O_NONBLOCK    04000
#define O_NDELAY    O_NONBLOCK
#define O_SYNC       010000
#define O_FSYNC      O_SYNC
#define O_ASYNC      020000

但可移植的方式是使用这些值的宏。

【讨论】:

  • 好的。您还可以澄清按位或手册页中的含义吗?
  • 我想出了我的问题的答案,所以接受:) 非常感谢。如果您能澄清这一点,将对我的理解有所帮助:D
【解决方案2】:

O_LARGEFILE 是特定于实现的,在 LSB(Linux 标准库)中定义为

0100000(等于0x8000)适用于 Linux x86(在 fcntl.h 中)

参见 LSB 参考:

http://linuxbase.org/navigator/browse/constant.php?cmd=list-by-name&Cname=O_LARGEFILE

O_RDONLY 的值为0,则O_RDONLY | O_LARGEFILE 等于0x8000

【讨论】:

  • 谢谢我知道了。对不起,答案就在我面前。我花了一些时间才弄清楚。真的很抱歉:(
猜你喜欢
  • 2016-01-30
  • 2012-08-14
  • 2017-01-03
  • 2012-04-03
  • 2011-06-09
  • 1970-01-01
  • 2020-11-30
  • 2021-06-02
  • 2012-10-23
相关资源
最近更新 更多