共享库无法访问程序的内存
Shared library can not access memory of a program
对不起我的英语。我已经创建了一个共享库,我的程序会动态加载这个库。它工作正常,但问题是我向共享库传递了一个指针,但这无法访问指针内存。另一方面也没有问题。
关于如何解决这个问题有什么想法吗?
注意:我使用linux,但如果这个想法在其他操作系统上有效,我会搜索这个等效的
这里的代码:
unsigned analizer::analizeText() {
std::cout << "thread started" << std::endl;
while(true)
{
pause.lock();
varMu.lock();
unsigned enable = __enable;
unsigned line = __line;
unsigned _colum = __colum;
unsigned offset = __offset;
varMu.unlock();
unsigned begin = offset;
std::cout << "get usafed docs" << std::endl;
std::cout << doc->getText() << std::endl;//the program crash
vector<document*> doc = _openDocuments->getUnsavedDocs(_openDocuments->traductDoc(this->doc)); std::cout << "relized" << std::endl;
while (beginElements.find(_openDocuments->getChar(begin-l)) == beginElements.end() and begin > 0)
--begin;
word = this->doc->getText().substr(begin,_offset-begin);
delete UunFile;
加载库:
#include <iostream>
pBear::language *_language;
using namespace pBear;
void language::load()
{
boost::filesystem::directory_iterator end;
for (boost::filesystem::directory_iterator it(languagePath); it != end; ++it)
{
void *hndl = dlopen(it->path().c_str(), RTLD_NOW);
if(hndl == NULL)
{
std::cerr « dlerror() « std::endl;
exit(-1);
}
std::function<LanguageDatas*(pBear::openDocuments*)> fun = (LanguageDatas*(*)(pBear::openDocuments*)) dlsym(hndl, "colorMaker");
LanguageDatas *dat = fun(openDocuments);
dataLanguages[dat->getName()] = dat;
}
}
传递指针:
ana = _language->getLanguage(doc->getProyect()->getLanguage())->getAnalizer(doc);
程序的最后消息:
分析
线程启动
获取usafed文档
分段故障(堆芯转储)
In:
std::function<LanguageDatas*(pBear::openDocuments*)> fun = (LanguageDatas*(*)(pBear::openDocuments*)) dlsym(hndl, "colorMaker");
LanguageDatas *dat = fun(openDocuments);
看起来您试图在共享库中找到一个名为colorMaker
的C++函数。然后调用dlsym
的结果,而不检查它是否为NULL
。
可以是dlsym
返回NULL
,从而导致分割错误。
C++函数的C样式名称colorMaker
是可疑的。仔细检查该共享库中的符号名称。
dlsym
从不抛出C++异常,因此需要检查其返回值:
LanguageDatas(*fun)(pBear::openDocuments*) = static_cast<(LanguageDatas(*)(pBear::openDocuments*)>(dlsym(hndl, "colorMaker"));
if(!fun)
throw std::runtime_error("colorMaker function is not found");
fun(openDocuments);
请注意,您不需要将函数指针封装到std::function
中即可调用它。
相关文章:
- 应用程序内存使用量减少
- 我们如何在ESP8266上减小程序内存上的代码大小
- 正在从程序内存中分解x指令
- mysqlcppconnen程序内存泄漏
- 这些结构在文件中的大小不同,但在程序内存中的大小相同
- 32 位应用程序内存不足
- C++空程序内存泄漏
- 设备驱动程序内存缓冲区处理器缓存问题
- C 程序内存冲突依赖于 std::cout (?)
- 空的Win32 C++应用程序内存消耗过多
- 在十六进制编辑器中写入程序内存,并以编程方式读取
- 为什么我的程序内存不释放?
- 简单的进程加载程序内存映射
- 虚拟大小导致程序内存不足
- 可视化C++程序内存计算
- 我的C++程序内存泄漏
- 图形驱动程序会导致我的应用程序内存泄漏吗
- 我的应用程序内存增加
- 调用JNI_CreateJavaVM函数后,应用程序内存增加了千兆字节
- 我的简单数独程序内存映射错误