C 如何确定一个病人的地址

C 如何确定一个病人的地址,c,memory-leaks,valgrind,C,Memory Leaks,Valgrind,Valgrind报告: ==4538== Invalid read of size 4 ==4538== at 0x822D3C6: _zval_ptr_dtor (zend.h:385) ==4538== by 0x823C1FF: _zval_ptr_dtor_wrapper (zend_variables.c:189) ==4538== by 0x824E1A1: zend_hash_destroy (zend_hash.c:529) ==4538== by 0x8

Valgrind报告:

==4538== Invalid read of size 4
==4538==    at 0x822D3C6: _zval_ptr_dtor (zend.h:385)
==4538==    by 0x823C1FF: _zval_ptr_dtor_wrapper (zend_variables.c:189)
==4538==    by 0x824E1A1: zend_hash_destroy (zend_hash.c:529)
==4538==    by 0x826655A: zend_object_std_dtor (zend_objects.c:45)
==4538==    by 0x8266A28: zend_objects_free_object_storage (zend_objects.c:126)
==4538==    by 0x826C43D: zend_objects_store_del_ref_by_handle_ex (zend_objects_API.c:220)
==4538==    by 0x826C0AC: zend_objects_store_del_ref (zend_objects_API.c:172)
==4538==    by 0x823BD77: _zval_dtor_func (zend_variables.c:52)
==4538==    by 0x822B99B: _zval_dtor (zend_variables.h:35)
==4538==    by 0x822D463: _zval_ptr_dtor (zend_execute_API.c:443)
==4538==    by 0x823C1FF: _zval_ptr_dtor_wrapper (zend_variables.c:189)
==4538==    by 0x824E518: zend_hash_apply_deleter (zend_hash.c:614)
==4538==  Address 0x44c1718 is 8 bytes inside a block of size 20 free'd
==4538==    at 0x4026E9C: free (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==4538==    by 0x8216374: _efree (zend_alloc.c:2358)
==4538==    by 0x822D48E: _zval_ptr_dtor (zend_execute_API.c:444)
==4538==    by 0x469B2C5: zim_ASTTree___destruct (parser.c:336)
==4538==    by 0x822F8CE: zend_call_function (zend_execute_API.c:986)
==4538==    by 0x825A8E2: zend_call_method (zend_interfaces.c:97)
==4538==    by 0x8266978: zend_objects_destroy_object (zend_objects.c:112)
==4538==    by 0x826C2AD: zend_objects_store_del_ref_by_handle_ex (zend_objects_API.c:206)
==4538==    by 0x826C0AC: zend_objects_store_del_ref (zend_objects_API.c:172)
==4538==    by 0x823BD77: _zval_dtor_func (zend_variables.c:52)
==4538==    by 0x822B99B: _zval_dtor (zend_variables.h:35)
==4538==    by 0x822D463: _zval_ptr_dtor (zend_execute_API.c:443)

如何找到无效读取的地址?

无效读取发生在一个名为zend\u hash\u destroy()的函数中

但是之前zend_objects_destroy_object()函数已经释放了内存


这一切都发生在“zend”内部,这一事实似乎表明“zend”存在问题。如果您试图调试PHP,我不确定您在这里使用valgrind会走得很远(尽管我非常喜欢这个工具).

我100%相信我的代码有缺陷,我弄乱了refcounting(垃圾收集器计数器),ZE在那里还需要一些其他值,这就是为什么会发生这种情况。所以我真的需要这个号码。具体来说,指针。线索是这样一条消息“地址0x44c1718是大小为20 free'd的块中的8字节”-您试图在0x44c1718读取,而0x44c1718是20字节块malloc'd中的8字节。如果您想知道谁是块的malloc'd,您可以使用--track origins=yes标志以及--leak check=yes运行valgrind。好的,如果我理解正确,那么块的开头是在
0x44c1710
?是的,或者更好的说法是:它就在那里。