【问题标题】:How can I know component's system call with using "strace"如何使用“strace”知道组件的系统调用
【发布时间】:2014-02-01 23:23:21
【问题描述】:

有人知道哪个系统调用属于 I/O 组件(WiFi、SDcard 或 GS​​P 等)吗?

我正在使用strace 跟踪应用程序,现在,我有一个应用程序(一个应用程序只有 wifi 开/关功能,A 的 PID=999),我使用 cmd 来键入命令

./strace -p 999 -t -v 如果我使用此命令./strace -p 999 -t -v -e trace=open,close,read,write 输出例如:

04:18:11.473383 read(52, "D", 1)        = 1

04:18:11.476191 write(39, "W", 1)       = 1

04:18:11.477198 write(53, "u", 1)       = 1

04:18:11.478114 read(38, "W", 16)       = 1

04:18:11.583430 read(52, "D", 1)        = 1

04:18:11.584315 write(39, "W", 1)       = 1

04:18:11.586787 write(53, "u", 1)       = 1

04:18:11.587824 read(38, "W", 16)       = 1

04:18:11.794337 read(38, "W", 16)       = 1

04:18:11.800227 read(38, "W", 16)       = 1

04:18:11.802210 syscall_983042(0x4e1d5428, 0x4e1d542c, 0, 0xfff, 0x408e54d8, 0x4e1d5428, 0x4e1d8469, 0xf0002, 0, 0x4e1d542c, 0xf81ef003, 0x14, 0, 0xbee5c738, 0x408b6093, 0x4006c8fc, 0x40000010, 0x4e1d5428, 0, 0, 0xc764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) = 

但是输出有这么多...我无法解释...

所以,我想知道

  1. 什么系统调用名称属于组件(属于 wifi 或属于 SD 卡)
  2. 如何使用组件获取组件的系统调用(应该使用什么命令?)
  3. 应该如何使用“strace”来追踪SDcard?我应该有B应用程序(B应用程序只是打开SD卡还是关闭SD卡?)我不知道我可以做什么实验。

【问题讨论】:

    标签: android system-calls strace


    【解决方案1】:

    所有这些调用都属于文件系统组件。然后通过内核将其路由到实际的硬件驱动器。因此,仅通过查看系统调用是无法知道的。

    您需要做的是查找打开调用以查看正在打开的文件。该调用将返回一个数字,称为文件句柄。此数字稍后用作读取/写入/关闭调用的第一个参数。

    对于 WIFI,事情甚至更棘手,因为您将不得不监视一大堆套接字调用以及诸如 sendto 之类的事情。另外,您需要交叉引用路由图。

    基本上,您尝试做的事情在系统调用级别上真的很难做到。我过去常常通过更深入地了解内核和驱动程序来做这些事情。你在这 更接近实际硬件以查看上下文。

    【讨论】:

    • 您好,感谢您的回复!!!你的回复:【所以看系统调用是无法知道的。】不知道是什么意思?因为我想知道跟踪组件的系统调用。 strace 可以跟踪应用程序 pid,所以,我有一个应用程序(只有 wifi 开/关功能,A 应用程序是这样的:ppt.cc/DYbJ)如果可能知道哪个系统调用属于 wifi 开/关另一个问题,strace 输出有这个【syscall_983042(0x4e1d5428, 0x4e1d542c,...】是什么意思???"syscall_983042"很多
    • 如果我追踪“愤怒的小鸟”,如果可能的话,知道 wifi 开/关是否打开,并且 SD 卡是否打开(这意味着运行愤怒的小鸟必须使用 wifi、SD 卡或其他组件,所以,我想每个组件的打开或关闭)
    • Linux 比你尝试的要复杂一点。应用程序进行的系统调用永远不会针对非常接近硬件的系统组件。应用程序与文件系统或套接字层通信。调用硬件子系统(如 WiFi 或 SD)取决于内核。如果您想从 strace 中找出答案,则需要在其上下文中考虑调用。
    • syscall_983042 形式的调用是 strace 不知道的调用,因此将它们作为数字表示。可能这些是 Android 特定的内核扩展,例如活页夹或唤醒锁。我相信 WiFi 是由活页夹打开和关闭的,但不要引用我的话。
    • 你的意思是,应用程序不使用组件?那么,我不能使用 strace 来获取应用程序的组件系统调用吗?
    【解决方案2】:

    请注意,为了更清楚地了解文件描述符是什么(如果您继续使用 strace),您可以使用最新 strace 版本的 -y 选项(至少 4.8 有它)。 -y 将文件描述符解码为路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 2020-05-18
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多