小编eud*_*xos的帖子

如何调试DLL加载失败:对内存位置的无效访问

我有一个MinGW64编译的DLL(python模块),加载时出错:

ImportError: DLL load failed: Invalid access to memory location
Run Code Online (Sandbox Code Playgroud)

DLL仅链接到64位库(Dependency Walker确认)并具有调试符号.代码是相当复杂的c ++ 11(大约30个源文件),我不能将它平分.我已经用MinGW64成功编译和测试了其他模块,工具链工作正常.

网络上的一些人报告了使用SSE2指令的代码的错误(我的hw支持的那些,我没有明确地使用它们)或从尚未初始化的全局变量中读取(有一些函数__attribute__((constructor)),但是根据我读过的内容,那些应该在MinGW64中运行得很好; 更新:我删除了所有构造函数以确保它不是原因 - 它没有区别).

分析错误来自何处的方法是什么?

我尝试了什么:

当我在调试器(使用ctypes.WinDLL(...))中加载DLL时,遗憾的是,我从gdb只获得了无意义的堆栈跟踪 - 显然,错误被捕获ntdll.dll并且信号被引发,但是它没有给出关于错误来自哪里的任何进一步提示:

Program received signal SIGTRAP, Trace/breakpoint trap.
0x0000000077c23522 in ntdll!ExpInterlockedPopEntrySListFault16 ()
   from C:\Windows\system32\ntdll.dll
(gdb) warning: HEAP[python.exe]:
warning: Invalid address specified to RtlSizeHeap( 00000000003B0000, 0000000002306830 )


(gdb) bt
#0  0x0000000077c23522 in ntdll!ExpInterlockedPopEntrySListFault16 ()
   from C:\Windows\system32\ntdll.dll
#1  0x0000000077c0c241 in ntdll!RtlZeroHeap ()
   from C:\Windows\system32\ntdll.dll
#2  0x0000000077c0c250 in ntdll!RtlZeroHeap ()
   from C:\Windows\system32\ntdll.dll
#3  0x0000000077c3c130 in …
Run Code Online (Sandbox Code Playgroud)

debugging dll mingw mingw-w64

5
推荐指数
1
解决办法
8486
查看次数

在一个程序中使用交互式和非交互式后端

我正在运行编写的代码PyQt4,使用matplotlib的Qt4Agg 后端在Windows中显示实时图.同时,我想在后台线程中使用matplotlib来生成(不同的)数字,这些数字只保存到文件中,而不是显示在屏幕上.

我可以Qt4Agg在后台线程中使用,但我得到了一堆

QPixmap: It is not safe to use pixmaps outside the GUI thread
Run Code Online (Sandbox Code Playgroud)

警告,在某些情况下也会崩溃.

据我所知,matplotlib目前支持在任何给定时间只使用一个后端(可以通过改变switch_backend,但关闭所有现有数字).有没有办法解决这个限制,并分配每个数字后端?

backend matplotlib

5
推荐指数
1
解决办法
846
查看次数

按值返回由互斥锁保护的shared_ptr是否安全?

这是一个代码示例:

class A {
  boost::mutex a_mutex;
  boost::shared_ptr<int> a;

  boost::shared_ptr<int> clone_a(void) {
    boost::lock_guard<boost::mutex> lock(a_mutex);
    return a;
  }
};
Run Code Online (Sandbox Code Playgroud)

建议尽管编译器优化,但boost::shared_ptr复制构造函数调用A::a将在boost::lock_guard析构函数调用之前.所以,打电话安全A::clone_a()吗?

c++ gcc shared-ptr

4
推荐指数
1
解决办法
648
查看次数

通过自定义函数序列化union类型:"static assertion failed :: typex :: value"

我正在cl_long2从OpenCL 序列化类型,这个类型定义如下(简化自/usr/include/CL/cl_platform.hpp):

typedef int64_t cl_long;
typedef union
{
    cl_long __attribute__ ((aligned(16))) s[2];
    struct{ cl_long  x, y; };
    struct{ cl_long  s0, s1; };
    struct{ cl_long  lo, hi; };
} cl_long2;
Run Code Online (Sandbox Code Playgroud)

我定义了以下独立序列化函数:

namespace boost{ namespace serialization {
template<class Archive> void serialize(Archive &ar, cl_long2 &i, const unsigned version){
   ar & make_nvp("x",i.x);
   ar & make_nvp("y",i.y);
}

}};
Run Code Online (Sandbox Code Playgroud)

当我编译我的代码,它从类成员调用cl_long2的序列化时,我得到以下错误,我无法理解(错误是相同的,如果它不是一个std::vector<cl_long2>,只是一个独立的变量):

/usr/include/boost/archive/detail/check.hpp: In function ‘void boost::archive::detail::check_object_level() [with T = cl_long2]’:
/usr/include/boost/archive/detail/iserializer.hpp:438:9:   instantiated from ‘static void boost::archive::detail::load_non_pointer_type<Archive>::invoke(Archive&, T&) [with T = cl_long2, …
Run Code Online (Sandbox Code Playgroud)

opencl boost-serialization

4
推荐指数
1
解决办法
1689
查看次数

在c ++ 11中使用`someType()`无法初始化哪些临时值?

我有一些宏对类型和初始值进行操作.我需要的初始值转换vInivType(vIni总是转换为vType,有时它具有相同的类型).在vIni可能是空的,以及,在这种情况下vType,应未初始化或默认初始化.reult传递给模板化函数.

简而言之,

template<typename T> void foo(const T& o);

foo(vType(vIni));
foo(vType());
Run Code Online (Sandbox Code Playgroud)

必须编译.

我已经发现foo(unsigned int())foo(int*())不会编译,但它可以使用typedef解决.

什么是其他情况(除了带有空格和指针的内置类型)会失败?

c++ initialization c++11

4
推荐指数
1
解决办法
116
查看次数

boost :: filesystem :: directory_iterator是否因删除而失效?

我正在遍历一个目录,当一个项目符合某些条件时,我将其删除.我可以在循环内安全地完成它,或者我必须在数组中保存路径并稍后删除吗?

我没有在boost :: filesystem docs中找到相关信息.

iterator boost-filesystem

4
推荐指数
1
解决办法
1338
查看次数

将剪辑滤镜应用于多个源

我在Paraview中有几个数据源,并将所有这些数据源(使用Clip过滤器)剪辑到我此刻需要查看的内容.将剪辑域设置为三次(或更多次)非常有意义.是否可以以某种方式共享这些参数,或将相同的过滤器实例应用于多个数据源?

pipeline paraview

4
推荐指数
1
解决办法
559
查看次数

灰度图像中2点之间的强度加权最小路径

我想确定图像中两个特定点之间的最小路径,即通过像素强度(灰度)加权的相邻像素之间的距离之和的路径将被最小化.例如,此图显示输入图像

原始图像

这是红色的(手绘)最小路径,从UL到LR角(黑色边界用作零重量填充):

示例最小路径

我发现matlab只具有graydist功能; 在ndimage/scikit-image /中有类似的东西吗?我找到了scipy.ndimage.morphology.distance_transform_edt,但我不确定是否以及如何将其用于此目的.如果算法仅返回非唯一最小值中的一个,则可以.

我对实现提示不感兴趣,它在算法上是一个相当简单的任务(至少是使用动态编程的简单实现),我正在寻找(组合)已经编码的例程来实现这一点.

python numpy scipy scikit-image ndimage

4
推荐指数
1
解决办法
442
查看次数

Docker中的调试限制是什么?

我正在调试一个编译的(c ++)python模块,它在docker容器内的导入时神秘地崩溃.当我在里面运行python3 gdb,然后导入,然后尝试打印回溯,我只得到

# gdb /usr/bin/pyton3
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.
...
(gdb) run -c 'import myModule'
warning: Error disabling address space randomization: Operation not permitted
During startup program terminated with signal SIGSEGV, Segmentation fault.
(gdb) bt
No stack.
(gdb)
Run Code Online (Sandbox Code Playgroud)

在Docker容器中gdb可以(不)做什么限制?崩溃本身令人惊讶,但无法进行调试更是如此.编译模块-ggdb2以包含尽可能多的调试信息.

debugging gdb docker

4
推荐指数
1
解决办法
981
查看次数

为什么char**(或任何T**)无效**无效?

在对Python C模块的第一条评论中--Malloc 在特定版本的Python中失败,@ user694733提到转换char**void**无效.我读了从Foo**到void**的无效转换 - 为什么隐式类型转换允许void*但不是void**?http://c-faq.com/ptrs/genericpp.html但是有一个标准的引用,但没有真正的例子,在这种情况下,这可能是不正确的,导致错误.例如思考void**double**,反之亦然,有没有在那里可以出错的情况下?为什么(从技术上讲,不仅仅因为它是UB)?

c c++ pointers casting

3
推荐指数
1
解决办法
455
查看次数