- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发通过调用脚本自动加载所有 *.so
模块库的系统。
我试图更新其中一个模块以支持 XML-RPC。我在 Ubuntu 10.10 上使用了库 ibxmlrpc-c3-dev
。 dlopen()
在我修改后失败,dlerror()
返回NULL的问题。编译不会返回任何错误。
我该如何调试和解决这个问题?下面是代码:
#include "stdlib.h"
#include "stdio.h"
#ifndef WIN32
#include "unistd.h"
#endif
#include "xmlrpc-c/base.h"
#include "xmlrpc-c/server.h"
#include "xmlrpc-c/server_abyss.h"
#include "config.h" /* information about this build environment */
而且,我添加了这个函数,大部分行都被注释掉了,即使 dlopen()
失败了:
int RPC_Server(int const port) {
// xmlrpc_server_abyss_parms serverparm;
//xmlrpc_registry * registryP;
xmlrpc_env env;
xmlrpc_env_init(&env);
//registryP = xmlrpc_registry_new(&env);
// xmlrpc_registry_add_method(
// &env, registryP, NULL, "sample.add", &sample_add, NULL);
/* In the modern form of the Abyss API, we supply parameters in memory
like a normal API. We select the modern form by setting
config_file_name to NULL:
*/
// serverparm.config_file_name = NULint
RPC_Server(int const port) {
// xmlrpc_server_abyss_parms serverparm;
//xmlrpc_registry * registryP;
xmlrpc_env env;
xmlrpc_env_init(&env);
//registryP = xmlrpc_registry_new(&env);
// xmlrpc_registry_add_method(
// &env, registryP, NULL, "sample.add", &sample_add, NULL);
/* In the modern form of the Abyss API, we supply parameters in memory
like a normal API. We select the modern form by setting
config_file_name to NULL:
*/
// serverparm.config_file_name = NULL;
// serverparm.registryP = registryP;
// serverparm.port_number = port;
// serverparm.log_file_name = "/tmp/xmlrpc_log";
// printf("Running XML-RPC server...\n");
// xmlrpc_server_abyss(&env, &serverparm, XMLRPC_APSIZE(log_file_name));
/* xmlrpc_server_abyss() never returns */
return 0;
}L;
// serverparm.registryP = registryP;
// serverparm.port_number = port;
// serverparm.log_file_name = "/tmp/xmlrpc_log";
// printf("Running XML-RPC server...\n");
// xmlrpc_server_abyss(&env, &serverparm, XMLRPC_APSIZE(log_file_name));
/* xmlrpc_server_abyss() never returns */
return 0;
}
这是用于加载模块的代码
#ifndef RTLD_NOW
#define RTLD_NOW DL_LAZY
#endif
void* handle;
char* error;
handle=dlopen(mod->binary_file, RTLD_NOW);
if (!handle){
LOG( " could not open file [%s]: %s\n",
mod_cfg->binary_file, dlerror() );
return 0;
}
最佳答案
在这段代码中:
handle=dlopen(mod->binary_file, RTLD_NOW);
if (!handle) {
LOG( " could not open file [%s]: %s\n",
mod_cfg->binary_file, dlerror() );
我能想到的让 dlerror()
返回 NULL
的最可能方法是 LOG
本身调用 之一code>dl*
例程(这将清除 dlerror
返回的错误状态)。
所以,
LOG
宏(如果它确实是 宏)扩展到什么,以及dlopen
、dlmopen
、dlsym
和dlvsym
上设置断点,观察其中一个在你调用 dlopen
之前和调用 dlerror
之前之后被调用。关于c - 如果 dlopen() 失败,dlerror() 如何返回 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8547372/
我在使用 C++/Linux 中的 dlopen 函数时遇到问题。 void * hsiftgpu = dlopen("/full/path/libsiftgpu.so", RTLD_LAZY); 我
我正在开发通过调用脚本自动加载所有 *.so 模块库的系统。 我试图更新其中一个模块以支持 XML-RPC。我在 Ubuntu 10.10 上使用了库 ibxmlrpc-c3-dev。 dlopen(
在 Python 3.8 上运行 Tensorflow 2、Cuda 10.1双 GPU 设置。 GPU被tf2识别,然后最初出现错误找不到cupti64_101.dll(CUDA库) 将 cupti
我有一个 ANSI C 程序,它使用传递 RTLD_LAZY 的 dlopen() 动态加载 .so 文件。我收到了 Undefined symbol "_nss_cache_cycle_preven
我正在尝试报告共享库上对 dlopen() 的失败调用导致的所有未解析符号。我已经尝试将 RTLD_LAZY 和 RTLD_NOW 作为 dlopen 调用的标志。我知道共享库有 10 个缺失符号(即
我正在 mt 计算机上构建 Docker,其中 NVDIA GPU 不可用。我使用 tensorflow/tensorflow Docker 镜像作为带 CPU 的基础镜像。 docker 文件 FR
我安装了 Capistrano 2,但在执行上限时遇到问题命令。操作系统是Windows 2012 R2。所以当我运行时,上限>部署, 显示的错误是, /usr/share/ruby/2.3.0/fi
当我跑 import tensorflow as tf tf.test.is_gpu_available( cuda_only=False, min_cuda_compute_capabili
我在使用 MinGw 在 Windows 上构建 MLT 框架时遇到了一些问题。我尝试按照 http://www.mltframework.org/bin/view/MLT/WindowsBuild
我将 tensorflow v.2.0 降级到 v.1.15 然后我在 ipython 中输入了一些代码进行检查。 但是,cudnn64_7.dll 存在一些问题 (base) C:\Users\pu
我是一名优秀的程序员,十分优秀!