共享库无法访问程序的内存

Shared library can not access memory of a program

本文关键字:程序 内存 访问 共享      更新时间:2023-10-16

对不起我的英语。我已经创建了一个共享库,我的程序会动态加载这个库。它工作正常,但问题是我向共享库传递了一个指针,但这无法访问指针内存。另一方面也没有问题。

关于如何解决这个问题有什么想法吗?

注意:我使用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中即可调用它。