php - 为什么 apache 将偏移量保存到 php-cli 保存虚拟内存地址的内存中?

标签 php c apache debugging memory-management

我正在调试 php。当查看内存中我知道指向地址的指针所在的位置时,我看到了指针 - 例如 22810408 (0x08048122) - 这是在使用 php 的 CLI 版本时。

但是,当我使用 apache2 并尝试做同样的事情时,我没有看到指向真实地址的指针。相反,我看到 ELF header 的偏移量,当添加到 ELF header 的地址时,它会给我“真实”地址。 例如,如果“真实”地址是 0x08048122,而 ELF header 位于 0x08048000,那么我会在同一位置看到 22010000 (0x122)。

当我试图找出堆栈上某物的“真实”地址时,问题就出现了。 “真实”地址应该是 0xbfccxxxx,但是当我将我找到的数字添加到 ELF header 时,事情就是不加起来!我得到了所有错误的地址。

我已经尝试谷歌搜索很长时间了,但我真的不确定如何正确措辞或搜索什么。

因此,我主要寻找的是有关为什么 Apache 具有偏移量而不是实际内存地址的更多信息,以及这一切如何与堆栈上的地址相关。谁能给我任何可能澄清的 Material 的指示?

最佳答案

Apache 使用 mod_php,一个 dynamically linked shared object library (。所以)。参见 what is mod_php? .其中 PHP-CLI 是 zend API(php 可执行文件)的前端。

mod_php 在其一侧加载并利用 zend API 来解析 PHP 文件并将其返回给 apache。如您所见,这里有很多间接性。这种方法比让 apache 使用 PHP 作为守护进程或类似的方法更好更快。

在调试 PHP 时,您通常会在比这更高的级别上工作,因为即使您获得了正确的偏移量; PHP 数据类型与 C 的数据类型不是 1:1(因为 PHP 的鸭子类型),并且对于关联数组和对象,内存中的表示与 C 对象的表示非常不同。

我建议您使用 specialized PHP debugger调试 PHP 应用程序。

关于php - 为什么 apache 将偏移量保存到 php-cli 保存虚拟内存地址的内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8864703/

相关文章:

php - 如何显示 Blob 数据的缩略图

php - mysql从某些类别中选择一条记录,对于其余类别,此规则不受影响

c - 在 C 中有一些内存泄漏

Django Apache 重定向问题

css - 网站html突然变得凌乱

PHP DOMXPath 正在剥离匹配文本中的我的标签

php - 获取空 JSON 响应

c - 全局变量的位置 w/o -fPIC

C 编译错误 : array type has incomplete element type

java - Apache FOP - PDF 创建俄语文本