使用Ptrace找出参数对于系统调用的确切含义

时间:2012-03-20 07:12:20

标签: c linux system-calls strace ptrace

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

  

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

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

  

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

我该如何手动执行此操作?我有什么地方可以找到O_LARGEFILE的值吗?我搜索了很多并遇到了this但它没有一切。还试过阅读strace代码,但没有遇到此转换的代码。
如果有人可以帮助我,那对我来说会很有帮助。另外如果你知道这是用strace写的,我想看看它。提前谢谢。

2 个答案:

答案 0 :(得分:1)

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

对于Linux x86(0100000

0x8000(等于fcntl.h

参见LSB参考:

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

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

答案 1 :(得分: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

但可行的方法是使用宏来表示这些值。