簡體   English   中英

具有“跟蹤/ BPT陷阱”的多線程應用程序中的dlopen()

[英]dlopen() in multithreaded application exit with “Trace/BPT trap”

我試圖在運行時使用以下命令在用C編寫的Mac OS X應用程序中加載框架:

dlopen("/System/Library/Frameworks/JavaVM.framework/JavaVM",RTLD_LAZY);

如果我從主線程調用dlopen() ,它將按預期工作。

當我從另一個線程調用它時,應用程序退出並出現錯誤: Trace/BPT trap

這是從主線程調用dlopen()的代碼(起作用):

int main(int argc, char** argv)
{

    void *result = dlopen("/System/Library/Frameworks/JavaVM.framework/JavaVM",RTLD_LAZY);
    if (!result) {
        printf("can't open library JavaVM: %s\n", dlerror());
    }
    else {
        printf("library JavaVM loaded\n");
    }

    return 0;
}

輸出為: 庫JavaVM已加載

這是從另一個線程調用dlopen()的代碼(並在對該函數的調用期間退出):

void *loadJava(void* arg)
{
    void *result = dlopen("/System/Library/Frameworks/JavaVM.framework/JavaVM",RTLD_LAZY);
    if (!result) {
        printf("can't open library JavaVM: %s\n", dlerror());
    }
    else {
        printf("library JavaVM loaded\n");
    }
}

int main(int argc, char** argv)
{
    pthread_t vmthread;

    struct rlimit limit;
    size_t stack_size = 0;
    int rc = getrlimit(RLIMIT_STACK, &limit);
    if (rc == 0) {
        if (limit.rlim_cur != 0LL) {
            stack_size = (size_t)limit.rlim_cur;
        }
    }

    pthread_attr_t thread_attr;
    pthread_attr_init(&thread_attr);
    pthread_attr_setscope(&thread_attr, PTHREAD_SCOPE_SYSTEM);
    pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
    if (stack_size > 0) {
        pthread_attr_setstacksize(&thread_attr, stack_size);
    }

    pthread_create(&vmthread, &thread_attr, loadJava, NULL);
    pthread_attr_destroy(&thread_attr);

    pthread_exit(NULL);

    return 0;
}

輸出為: Trace / BPT陷阱

錯誤在哪里? 抱歉,這是一個愚蠢的問題,但我還是新手

似乎dlopen()並不是線程安全的,因此您不應在多個線程下調用它。
也許不是dlopen()也不是線程安全的,而是庫的初始化代碼在加載時運行。

沒有理由在線程下調用dlopen,因為它不會多次加載該庫。
當您多次加載同一文件時,則第二次不執行任何操作(除了增加一些引用計數),並且僅返回相同的句柄。 因此,通過每個線程加載它不會獲得任何收益。

您可以使用dlmopen()多次真正加載一個庫。 但這僅限於15次。
即使這樣,您也應該在啟動線程之前(在每個線程中為其提供庫句柄)在main()中進行操作,而不是從線程內部進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM