- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这几天我一直在为一个神秘的错误而苦苦挣扎。我使用的是 PHP 7.1.0RC3(我在启用ZTS/pthreads 的情况下重新编译了自己)。最近,我一直在进行重构,用 Redis 替换 MySQL 以优化我的应用程序中非磁盘值(value)的数据 I/O。
我有一个脚本可以为每个加密货币市场创建一个线程 (A)。线程 (A) 为每个交易策略创建另一个线程 (B)。 B 线程总是在 A 线程之前同步。
我不断收到此错误:zend_mm_heap 已损坏
。每次我运行脚本时,它都会在不同的执行点发生。
我已经尝试了所有建议的修复、100 多个 Google 页面。垃圾收集、PHP 配置/编译,所有这些都经过了非常详细的审查。我没有发现任何与“zend_mm_heap 已损坏”、PThreads 和 Redis/Predis 相关的内容,而其他“修复”没有任何效果...
所有数据都从 Redis 读取并保存到 Redis(通过 Predis)。只有在线程 A 或线程 B 中使用 Predis 时才会出现错误消息(每次都会更改)。当两个 Predis 方法调用快速连续发生时(例如设置然后获取),它会更频繁地发生。
如果我使用 shell_exec()
直接通过 CLI 运行 Redis 命令,我不会看到此错误。但是,它的速度要慢得多,所以可能只是错过了这种边缘情况?
如果有人可以对以下任何内容提供任何意见/想法,我将不胜感激:
zend_mm_heap corrupted
通常会在线程“安全”环境(又名:ZTS)中发生?或者我该如何防范???我别无选择,请怜悯。我可以共享代码示例,但将它们粘贴到此处不会很有用。
编辑我用 ./configure --enable-maintainer-zts --enable-pthreads --with-pthreads-sanitize --with-mysqli --enable-embedded-mysqli
重新编译了 PHP,我看到了一个新的我以前从未见过的错误:
==2716== ERROR: AddressSanitizer: heap-use-after-free on address 0x600800001c15 at pc 0xe25a87 bp 0x7f7a049feae0 sp 0x7f7a049fead0
READ of size 1 at 0x600800001c15 thread T1632
#0 0xe25a86 (/usr/local/bin/php+0xe25a86)
#1 0xe953c8 (/usr/local/bin/php+0xe953c8)
#2 0xe4935b (/usr/local/bin/php+0xe4935b)
#3 0xcbede3 (/usr/local/bin/php+0xcbede3)
#4 0x98cfa9 (/usr/local/bin/php+0x98cfa9)
#5 0x99dc3c (/usr/local/bin/php+0x99dc3c)
#6 0x7f7b57e74a97 (/usr/lib64/libasan.so.0.0.0+0x19a97)
#7 0x7f7b5694edc4 (/usr/lib64/libpthread-2.17.so+0x7dc4)
#8 0x7f7b5667d73c (/usr/lib64/libc-2.17.so+0xf773c)
0x600800001c15 is located 5 bytes inside of 48-byte region [0x600800001c10,0x600800001c40)
freed by thread T1623 here:
#0 0x7f7b57e71009 (/usr/lib64/libasan.so.0.0.0+0x16009)
#1 0xe259fb (/usr/local/bin/php+0xe259fb)
#2 0xe953c8 (/usr/local/bin/php+0xe953c8)
#3 0xe4935b (/usr/local/bin/php+0xe4935b)
#4 0xcbede3 (/usr/local/bin/php+0xcbede3)
#5 0x98cfa9 (/usr/local/bin/php+0x98cfa9)
#6 0x99dc3c (/usr/local/bin/php+0x99dc3c)
#7 0x7f7b57e74a97 (/usr/lib64/libasan.so.0.0.0+0x19a97)
previously allocated by thread T0 here:
#0 0x7f7b57e71129 (/usr/lib64/libasan.so.0.0.0+0x16129)
#1 0xdb0118 (/usr/local/bin/php+0xdb0118)
#2 0xe64f6c (/usr/local/bin/php+0xe64f6c)
#3 0xe68c5d (/usr/local/bin/php+0xe68c5d)
#4 0xcc4dcc (/usr/local/bin/php+0xcc4dcc)
#5 0xcc5972 (/usr/local/bin/php+0xcc5972)
#6 0x111f82c (/usr/local/bin/php+0x111f82c)
#7 0x44c781 (/usr/local/bin/php+0x44c781)
#8 0x7f7b565a7b34 (/usr/lib64/libc-2.17.so+0x21b34)
Thread T1632 created by T0 here:
#0 0x7f7b57e65c3a (/usr/lib64/libasan.so.0.0.0+0xac3a)
#1 0x99e4cb (/usr/local/bin/php+0x99e4cb)
#2 0x975d2a (/usr/local/bin/php+0x975d2a)
#3 0x11105c1 (/usr/local/bin/php+0x11105c1)
#4 0xf71de2 (/usr/local/bin/php+0xf71de2)
#5 0x97b385 (/usr/local/bin/php+0x97b385)
#6 0x11126bc (/usr/local/bin/php+0x11126bc)
#7 0xf71de2 (/usr/local/bin/php+0xf71de2)
#8 0x97b385 (/usr/local/bin/php+0x97b385)
#9 0x11126bc (/usr/local/bin/php+0x11126bc)
#10 0xf71de2 (/usr/local/bin/php+0xf71de2)
#11 0x97b385 (/usr/local/bin/php+0x97b385)
#12 0x11126bc (/usr/local/bin/php+0x11126bc)
#13 0xf71de2 (/usr/local/bin/php+0xf71de2)
#14 0x97b385 (/usr/local/bin/php+0x97b385)
#15 0x11126bc (/usr/local/bin/php+0x11126bc)
#16 0xf71de2 (/usr/local/bin/php+0xf71de2)
#17 0x97b385 (/usr/local/bin/php+0x97b385)
#18 0x1110b28 (/usr/local/bin/php+0x1110b28)
#19 0xf71de2 (/usr/local/bin/php+0xf71de2)
#20 0x97b385 (/usr/local/bin/php+0x97b385)
#21 0x11126bc (/usr/local/bin/php+0x11126bc)
#22 0xf71de2 (/usr/local/bin/php+0xf71de2)
#23 0x97b385 (/usr/local/bin/php+0x97b385)
#24 0x111c28a (/usr/local/bin/php+0x111c28a)
#25 0xe52281 (/usr/local/bin/php+0xe52281)
#26 0xcc766f (/usr/local/bin/php+0xcc766f)
#27 0x1121d36 (/usr/local/bin/php+0x1121d36)
#28 0x44d202 (/usr/local/bin/php+0x44d202)
#29 0x7f7b565a7b34 (/usr/lib64/libc-2.17.so+0x21b34)
Thread T1623 created by T0 here:
#0 0x7f7b57e65c3a (/usr/lib64/libasan.so.0.0.0+0xac3a)
#1 0x99e4cb (/usr/local/bin/php+0x99e4cb)
#2 0x975d2a (/usr/local/bin/php+0x975d2a)
#3 0x11105c1 (/usr/local/bin/php+0x11105c1)
#4 0xf71de2 (/usr/local/bin/php+0xf71de2)
#5 0x97b385 (/usr/local/bin/php+0x97b385)
#6 0x11126bc (/usr/local/bin/php+0x11126bc)
#7 0xf71de2 (/usr/local/bin/php+0xf71de2)
#8 0x97b385 (/usr/local/bin/php+0x97b385)
#9 0x11126bc (/usr/local/bin/php+0x11126bc)
#10 0xf71de2 (/usr/local/bin/php+0xf71de2)
#11 0x97b385 (/usr/local/bin/php+0x97b385)
#12 0x11126bc (/usr/local/bin/php+0x11126bc)
#13 0xf71de2 (/usr/local/bin/php+0xf71de2)
#14 0x97b385 (/usr/local/bin/php+0x97b385)
#15 0x11126bc (/usr/local/bin/php+0x11126bc)
#16 0xf71de2 (/usr/local/bin/php+0xf71de2)
#17 0x97b385 (/usr/local/bin/php+0x97b385)
#18 0x1110b28 (/usr/local/bin/php+0x1110b28)
#19 0xf71de2 (/usr/local/bin/php+0xf71de2)
#20 0x97b385 (/usr/local/bin/php+0x97b385)
#21 0x11126bc (/usr/local/bin/php+0x11126bc)
#22 0xf71de2 (/usr/local/bin/php+0xf71de2)
#23 0x97b385 (/usr/local/bin/php+0x97b385)
#24 0x111c28a (/usr/local/bin/php+0x111c28a)
#25 0xe52281 (/usr/local/bin/php+0xe52281)
#26 0xcc766f (/usr/local/bin/php+0xcc766f)
#27 0x1121d36 (/usr/local/bin/php+0x1121d36)
#28 0x44d202 (/usr/local/bin/php+0x44d202)
#29 0x7f7b565a7b34 (/usr/lib64/libc-2.17.so+0x21b34)
Shadow bytes around the buggy address:
0x0c017fff8330: fa fa 00 00 00 00 00 00 fa fa 00 00 00 00 00 fa
0x0c017fff8340: fa fa 00 00 00 00 00 fa fa fa 00 00 00 00 00 fa
0x0c017fff8350: fa fa 00 00 00 00 00 fa fa fa 00 00 00 00 00 00
0x0c017fff8360: fa fa 00 00 00 00 00 00 fa fa 00 00 00 00 00 fa
0x0c017fff8370: fa fa 00 00 00 00 00 fa fa fa 00 00 00 00 00 00
=>0x0c017fff8380: fa fa[fd]fd fd fd fd fd fa fa 00 00 00 00 00 00
0x0c017fff8390: fa fa 00 00 00 00 00 00 fa fa 00 00 00 00 00 00
0x0c017fff83a0: fa fa 00 00 00 00 00 00 fa fa 00 00 00 00 00 00
0x0c017fff83b0: fa fa 00 00 00 00 00 00 fa fa 00 00 00 00 00 00
0x0c017fff83c0: fa fa 00 00 00 00 00 00 fa fa 00 00 00 00 00 fa
0x0c017fff83d0: fa fa 00 00 00 00 00 fa fa fa 00 00 00 00 00 fa
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Heap righ redzone: fb
Freed Heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack partial redzone: f4
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
ASan internal: fe
==2716== ABORTING
最佳答案
我找到了内存损坏的根源,“修复”非常简单。我发现在 pthreads 中使用 phpiredis $client 的唯一“非致命”方式是在当前本地范围内显式连接/执行命令/断开连接。
总结起来,在高负载下会导致内存损坏,原因如下:
不过,当以相同的方式/上下文将 MySQLi $client 传递给另一个对象时,不会发生内存损坏。
我希望这能拯救其他人度过我目睹的绝望一周。这是在 pthreads 中必须使用 phpiredis 的方式:
// Instantiate a local raw phpiredis $client and execute get/set commands using $client directly
// @Result: This WORKS :D
$client = phpiredis_connect('127.0.0.1', 6379);
$key = "table_name-_-$this->id";
foreach($args as $prop=>$val)
if(isset($prop) && isset($val))
phpiredis_command($client, "hset $key $prop $val");
$obj = phpiredis_command($client, "hgetall $key");
echo json_encode($obj);
phpiredis_disconnect($client);
关于PHP + PThreads + Redis/Predis = zend_mm_heap 已损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43053652/
我正在将一些 pthreads 代码添加到我使用 autotools 构建的 Linux 应用程序中。我收到关于未在 libpthreads 中链接的错误。所以我想在 autotools 中指定 pt
libpthread 库位于 Linux 系统的哪个目录中? 最佳答案 有多种方法可以找出这一点。 只需输入 find / -name 'libpthread.so' -print找到名为 libpt
pthread 属性对象是否需要在使用它们的对象的生命周期内存在,或者在使用它们后立即销毁它们是否安全?例如: // Create the mutex attributes. pthread_mute
到目前为止我读过的所有文档似乎都表明我的 vxWorks (6.8) 版本中存在 posix 线程支持,但是一个简单的测试应用程序无法按预期执行。来源如下: tTest.h #include cla
我试图找到指定 pthreads 标准的文档。我见过各种指向 IEEE 1003.1c-1995 的链接(即 Wikipedia 或 OpenGroup )。然而,当我在 IEEE 标准站点上搜索此文
我试图找到指定 pthreads 标准的文档。我见过各种指向 IEEE 1003.1c-1995 的链接(即 Wikipedia 或 OpenGroup )。然而,当我在 IEEE 标准站点上搜索此文
我在 MSVC 2010 上运行一个 pthread,我已经包含 pthreadVC2 .lib & .dll。来自以下网站 http://sourceware.org/pthreads-win32/
我的问题是: 如何在不更改其他 pthread 中的当前目录的情况下更改 pthread 中的当前目录,我找到了一个使用 openat() 函数的解决方案,但我没有找到任何解释它如何工作的示例。 使用
是否可以通过任何方式更改进程可以创建的 pthread 数量限制? 目前在我的 linux 系统上我可以创建大约 380 个线程,但我想增加它,只要内存可用。 最佳答案 减少用户的堆栈大小' ulim
问候。我正在尝试创建一个 autoconf 配置脚本,该脚本自动检查要使用的 pthread 选项,并且理想情况下,在使用 gcc 编译时指定 -pthread。 我希望 AX_PTHREAD 能够工
如何知道 pthread 是否死亡? 有办法检查 pthread 状态吗? 最佳答案 if(pthread_kill(the_thread, 0) == 0) { /* still runni
我正在从一个由互斥锁控制的固定大小的全局池中分配我的 pthread 线程特定数据。 (有问题的代码不允许动态分配内存;它允许使用的所有内存都由调用者作为单个缓冲区提供。pthreads 可能会分配内
在阅读了一些 MPI 规范后,我了解到,当使用 MPI_THREAD_SERIALIZED 进行初始化时,程序必须确保发生在不同线程中的 MPI_Send/Recv 调用不能重叠。换句话说,您需要一个
我尝试根据 this guide 安装 pthread win32 . 我将 pthreadVC2.dll 文件添加到 C:\Windows 并将 pthreadVC2.lib 文件添加到 C:\Pr
我有一个 pthreads 程序。我必须使用 Linux 中的 gcc -pthread(-pthreads 是无法识别的选项)和 Sun 中的 gcc -pthreads(-pthread 是无法识
我有一个包含文件名列表的文件,我想在其中搜索一个词并替换它我稍微修改了代码只是为了在这里只显示相关部分问题是如果我在该列表中只有一个文件,它不会用多线程处理它,因为线程只有在我有多个文件时才工作所以我
我正在编写一个 SMT 程序,并且正在尝试解决一个有趣的问题。 我需要所有函数一起退出,但是有些线程卡在障碍物上,即使我不希望它们这样做。 我的问题是:当我删除障碍时会发生什么?卡在屏障处的线程会释放
我阅读了有关 pthread 及其相关 API 的所有内容,以创建、锁定和同步不同的线程。但我经常发现线程池、消费者/生产者等词提示。我理解这些是 pthread 实现的模型。 任何人都可以让我知道
我在 man pthread_join 中读到,多个 pthread 不能加入一个已经加入的 pthread。还有另一种方法可以达到相同的结果吗?多个 pthread 挂起自己,直到某个特定的 pth
我知道 OpenMP 实际上只是一组编译成 pthread 的宏。有没有办法在编译的其余部分发生之前查看 pthread 代码?我正在使用 GCC 进行编译。 最佳答案 首先,OpenMP 不是一组简
我是一名优秀的程序员,十分优秀!