V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  zhiqiang  ›  全部回复第 6 页 / 共 9 页
回复总数  174
1  2  3  4  5  6  7  8  9  
2018-12-04 13:30:07 +08:00
回复了 zhiqiang 创建的主题 C C++什么情况下会出现类 static 成员析构错误?
我用 boost::stacktrace 把静态变量的初始化和析构的 stack 都打了出来。发现了问题。

原始没出问题的代码:会有多次初始化和析构,但初始化和析构都用的是各自 dll 里面的代码。

出问题的代码:有多次初始化和析构,但初始化和析构都用的是 exe 程序里面的代码。

现在看,问题主要出现在上面链接的问题。不知道为什么,出问题的程序中,dll 在调用函数时,没用自己的实现,都用的 exe 主程序的实现。( dll 和 exe 在变异时都链接了 token.a,因此都包含了 Token 类的实现)。
2018-12-04 12:33:13 +08:00
回复了 zhiqiang 创建的主题 C C++什么情况下会出现类 static 成员析构错误?
我把这个类静态成员`static const std::vector<std::string>`换成一个自定义的`statc const StaticMember`,然后在`StaticMember`的初始化和析构函数里打印出 log,包含 StaticMember 所在的地址(std::cout << (void*)this)。

然后发现一个神奇的现象,它进行了 4 次初始化和多次析构!并且地址是同一个地址。

```
init, addr:0x8e77a8
init, addr:0x8e77a8
init, addr:0x8e77a8
init, addr:0x8e77a8
deinit, addr:0x8e77a8
deinit, addr:0x8e77a8
```

我的程序结构大约这样的:1 个`exe`文件通过`dlopen`打开了若干个`so`文件,这些 so 文件都链接了`Token`类。这个`Token`类就是包含这个出错的静态成员的类。在编译时,我先把`Token`编译成了`token.a`,然后`exe`和这些`so`文件链接时都链接了`token.a`。

另外,我这个程序以前是能跑的,但只要加一行很简单的代码(这行代码与引起问题的类完全无关),就会导致上面的问题。我才加的这一行代码可能引起了链接程序的一些变化。

我试图简化程序,但还没复现出同样的结果。

@geelaw @hitmanx @zmj1316
2018-12-04 10:30:20 +08:00
回复了 zhiqiang 创建的主题 C C++什么情况下会出现类 static 成员析构错误?
@zmj1316 拿 c_str 去 free 不太可能,这个变量里面保存的是字符常量。可能是删除或修改别的导致堆内存损害。
2018-12-04 08:41:23 +08:00
回复了 zhiqiang 创建的主题 C C++什么情况下会出现类 static 成员析构错误?
@geelaw 这是一个超大型程序,里面有好几个 so 文件。就这个问题而言,我不确定有 minimal reproduction。这种在`_exit`时出现问题的情况我还是第一次遇到,`gdb`里显示的代码都不是我的代码。

错误类型就是典型的 core dump。

我也感觉是 double free 或者类似的问题。但我用 valgrind 没检查出来。在这里想问问可能是什么原因,以及用什么工具可以检查到这个错误。
2018-12-04 08:10:55 +08:00
回复了 zhiqiang 创建的主题 C C++什么情况下会出现类 static 成员析构错误?
@zmj1316 类的 static 变量应该放在单独的内存位置,其析构是程序在结束时自动析构的。我没听说可以主动析构。

写坏这个我就不清楚了,不知道用什么东西可以查出来。我用 valgrind 也是到上面显示的地方才出错,前面没有提示 double free 之类的错误。
2018-11-27 09:21:02 +08:00
回复了 zhiqiang 创建的主题 Markdown mkdocs 搜索如何支持中文?
汇报一下最后的方案。

主题是没办法替换的,因为原主题已经集成了一些东西。

替换 js 文件之前就试过,没成功,而且替换之后每次升级就需要重新操作,太麻烦。

后来是自己写了一个简单的 js 文件,不用索引,直接强搜所有文档。几十个文档,也瞬间就能搜完。
2018-11-22 12:34:16 +08:00
回复了 zhiqiang 创建的主题 Markdown mkdocs 搜索如何支持中文?
@RYAN0UP 对。这个怎么弄的?
@iamniconico 这个简单,换公司。
2018-10-25 13:53:07 +08:00
回复了 zhiqiang 创建的主题 C YouCompleteMe 有什么替代品?
@memorybox mcm2 看上去还可以,但只支持 nvim,以及非官方支持 vim8。
2018-10-25 13:52:32 +08:00
回复了 zhiqiang 创建的主题 C YouCompleteMe 有什么替代品?
@Yoock ycm 的文档不建议用系统的库。

不过现在状况下,也只能这么一试了。
2018-10-23 08:36:11 +08:00
回复了 zhiqiang 创建的主题 C windows 下 C++如何生成跨 DLL/SO 文件的单例?
@wutiantong 不是这个~~~
2018-10-23 08:35:57 +08:00
回复了 zhiqiang 创建的主题 C windows 下 C++如何生成跨 DLL/SO 文件的单例?
@noli 加一个限制条件:dll 是运行在同一个进程里的。

Linux 系统上我上面的示例代码就可以做到 。关键在于 Linux 可以在运行时进行函数链接。
2018-10-22 17:43:41 +08:00
回复了 zhiqiang 创建的主题 C windows 下 C++如何生成跨 DLL/SO 文件的单例?
@z4none 我去学习了一下 #pragma data_seg,这个是多个进程调用同一个 dll 文件时,共享该 dll 里面的某个变量。

这跟我说的不一样。我说的是程序同时调用多个不同的 dll 文件时,这些 dll 里的 log 对象需要引用到同一个 log 变量。
2018-10-22 17:40:57 +08:00
回复了 zhiqiang 创建的主题 Django django 如何记录和查看用户访问记录?
最后自己写了一个。代码倒是不长。
2018-10-22 17:39:28 +08:00
回复了 zhiqiang 创建的主题 C windows 下 C++如何生成跨 DLL/SO 文件的单例?
@owt5008137 你说的是需要把 log 库做成一个 dll,这样 log 库就不能直接 header only 了。

但在 linux 下是能实现我所需要的,同样的实现在 windows 下就不行。有些跨平台开源 log 库也是 header only 的,我还没细看他们怎么写的。
2018-10-22 17:36:50 +08:00
回复了 zhiqiang 创建的主题 C windows 下 C++如何生成跨 DLL/SO 文件的单例?
@justou 你这种方案需要把 log 库做成一个 dll,这样 log 库就不能直接 header only 了。
2018-10-22 17:31:26 +08:00
回复了 zhiqiang 创建的主题 C windows 下 C++如何生成跨 DLL/SO 文件的单例?
@justou 谢谢。

不过我的需求是在 exe 里定义 get_logger() 函数。所有的 dll 从 exe 里去取这个函数的实现(因为我有很多个地位平等的 dll,这些 dll 是按需加载的)。跟你给的例子恰好相反。
2018-10-22 17:25:07 +08:00
回复了 zhiqiang 创建的主题 C windows 下 C++如何生成跨 DLL/SO 文件的单例?
@wutiantong haha,你也在这里混啊。现在在哪呢
2018-10-18 21:14:18 +08:00
回复了 zhiqiang 创建的主题 C windows 下 C++如何生成跨 DLL/SO 文件的单例?
@justou 我加了一些 dllexport dllimport 还是不行。
1  2  3  4  5  6  7  8  9  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1468 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 22ms · UTC 23:55 · PVG 07:55 · LAX 15:55 · JFK 18:55
Developed with CodeLauncher
♥ Do have faith in what you're doing.