修改Python3.8.10源码后编译报错Makefile:617: sharedmods Error 139求助
问题根因与修复方案
核心错误原因
- 参数传递错误:
PyUnicode_Append函数的入参是二级指针PyObject **p_left,你在调用自定义的PyUnicode_Append_Handler时误用了未定义的变量left,实际传入的是野指针,访问该指针直接触发段错误,你遇到的退出码139就是Linux下段错误的标准返回值。 - 缺少合法性校验:没有校验
right是否为合法Unicode对象,也没有检查PyUnicode_AsUTF8的返回值是否为空,遇到异常场景会直接崩溃。 - 路径权限风险:如果
/home/pyiast/目录不存在或者当前运行编译的用户没有该目录的写权限,虽然不会直接崩溃但会导致日志无法写入。
修复后的代码示例
void PyUnicode_Append_Handler(PyObject *left, PyObject *right) { // 先校验两个参数都是合法Unicode对象 if (!PyUnicode_Check(left) || !PyUnicode_Check(right)) { return; } FILE* fp = fopen("/home/pyiast/append.log","a+"); if (NULL == fp){ return; } const char *left_str = PyUnicode_AsUTF8(left); const char *right_str = PyUnicode_AsUTF8(right); // 校验UTF8转换结果非空 if (left_str == NULL || right_str == NULL) { fclose(fp); return; } PyObject *data = PyUnicode_FromFormat("append:dst=%s, src=%s\n", left_str, right_str); if (data != NULL){ PyObject_Print(data, fp, 0); Py_DECREF(data); } fclose(fp); } void PyUnicode_Append(PyObject **p_left, PyObject *right) { //... other code assert(_PyUnicode_CheckConsistency(*p_left, 1)); // 修正参数:传入解引用后的*p_left PyUnicode_Append_Handler(*p_left, right); }
额外注意事项
- 编译前先确保
/home/pyiast/目录存在,且执行make的用户对该目录有读写权限 - 修复完成后先执行
make clean清理之前的编译缓存,再重新执行make编译,避免旧的目标文件影响结果
内容的提问来源于stack exchange,提问作者yditxu
相关产品推荐
相关产品推荐

