chuan-yun / Molten

php probe for zipkin and opentracing
Apache License 2.0
792 stars 160 forks source link

关于molten_set_traceid($trace_id)设置当前上下文traceid问题 #128

Closed illusionzhy closed 5 years ago

illusionzhy commented 5 years ago

关于molten_set_traceid() 问题,函数如何定义使用?执行提示错误,能否帮忙答疑下;

[~]# php  test_get.php 
Hello Redis段错误   或  Hello Redis luster_hkeysCannot decode spans
[~]# more test_get.php 
<?php
#   $traceid=molten_get_traceid();
#   header("traceid:$traceid");
   $redis = new Redis(); 
   $redis->connect('192.168.10.43', 10003);
   $redis->select(2);
   $redis->set( "testKey" , "Hello Redis");
   echo $redis->get("testKey");
   $trace_id='14f28a84cedeb0c7';
   molten_set_traceid($trace_id);
   echo  molten_get_traceid();
?>
molten version | 0.1.2beta
--------------------------------
PHP 7.1.17 (cli) (built: Apr 28 2018 07:52:48) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.1.17, Copyright (c) 1999-2018, by Zend Technologies
/* {{{ molten_set_traceid */
PHP_FUNCTION(molten_set_traceid)
{
    char *trace_id;    
    int trace_id_len;
    int result = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &trace_id, &trace_id_len);
    if (result  == SUCCESS) {
        if (PTG(pct).pch.is_sampled == 1) {
            efree(PTG(pct).pch.trace_id->val);
            PTG(pct).pch.trace_id->val = estrndup(trace_id, trace_id_len);
        } else {
            RETURN_BOOL(IS_TRUE);
        }
    } else {
        RETURN_BOOL(IS_FALSE);
    }
}
/* }}} */
根据分析,应该是持久化内存,调用了efree会导致段错误;暂时不知道该怎么修复=_=!!
eg:如果你用 efree() 释放了不是由 emalloc() 或 estrdup() 分配的内存时可能会导致段错误
illusionzhy commented 5 years ago

问题已经修复,问题原因为:”estrndup/estrdup函数参数为NULL时,产生的段错误问题;” 需修改molten_set_traceid 代码如下:

/* {{{ molten_set_traceid */
PHP_FUNCTION(molten_set_traceid)
{
        char *trace_id = NULL;
        size_t trace_id_len, len;
        if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &trace_id, &trace_id_len) == FAILURE) {
                return;
        }
        efree(PTG(pct).pch.trace_id->val);
        PTG(pct).pch.trace_id->val = estrndup(trace_id, trace_id_len);
       /*  RETURN_STRING(PTG(pct).pch.trace_id->val); */
}
/* }}} */

在php方法使用前设置traceid 可自定义参数;示例如下:

[~]# vi test_get.php
<?php
   molten_set_traceid("8a1224f28a84ced7");
   $redis = new Redis();
   $redis->connect('192.168.10.43', 10003);
   $redis->select(2);
   $redis->set( "testKey" , "Hello Redis");
#   echo $redis->get("testKey");
   echo  molten_get_traceid();
#   $trace_id="22224f28a84ced7";
#   molten_set_traceid("11224f28a84ced7");
#   echo  molten_get_traceid();
?>