opt*_*nal 5 php c apache debugging memory-management
我正在调试php.当我看到内存中我知道指向地址的指针的地方时,我看到指针 - 例如22810408(0x08048122) - 这是在使用CLI的CLI版本时.
但是,当我使用apache2并尝试做同样的事情时,我没有看到指向真实地址的指针.相反,我看到ELF头的偏移量,当添加到ELF头的地址时,给我"真实"的地址.例如,如果"真实"地址是0x08048122,并且ELF标题位于0x08048000,那么我会在同一位置看到22010000(0x122).
当我试图找出堆栈中某些东西的"真实"地址时,问题就出现了."真实"地址应该是0xbfccxxxx,但是当我将数字添加到ELF标题时,事情就是不加起来!我得到了所有错误的地址.
我已经尝试了谷歌搜索了很长时间,但我真的不确定如何正确地说这个,或者搜索什么.
所以,我基本上寻找的是关于为什么Apache有偏移而不是实际内存地址的更多信息,以及这些都与堆栈上的地址有什么关系.任何人都可以给我任何可能澄清的材料吗?
Apache 使用动态链接共享对象库mod_php( .so)。看看什么是mod_php?。PHP-CLI 是 zend API(php 可执行文件)的前端。
mod_php 本身加载并利用 zend API 来解析 PHP 文件并将其返回给 apache。正如您所看到的,这里有很多间接的内容。这种方法比让 apache 使用 PHP 作为守护进程或类似的方法效果更好、更快。
调试 PHP 时,您通常会在比这更高的级别上工作,因为即使您获得了正确的偏移量;PHP 数据类型与 C 数据类型不是 1:1(因为 PHP 的鸭子类型),并且对于关联数组和对象,内存中的表示与 C 对象的表示非常不同。
我建议您使用专门的 PHP 调试器来调试 PHP 应用程序。
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |