Найти - Пользователи
Полная версия: ошибка сегментирования на 64-разр.
Начало » Python для новичков » ошибка сегментирования на 64-разр.
1
nindza
Почему режеться указатель при передачи в сишный модуль? Это баг Питона или неправильное кодирование? Как можно устранить?

На более маленьких массивах все ok. Т.ж. на 32-битных системах работает без проблем.

$ cat test.py 
#!/usr/bin/python
import ctypes
import numpy
from sys import path
path.append('./../')
from module.matrix import *
A = myones(200,200)
print A

$ cat ../module/libmatrix.c
void ones_matrix(
const int n,
const int m,
double* mtx)
{
for(int i=0; i<n; ++i)
for(int j=0; j<m; ++j)
*(mtx++)=(i+j)/2.;
}

$ gcc -std=gnu99 -fpic -shared -g -pg libmatrix.c -o libmatrix.so

$ cat ../module/matrix.py
#!/usr/bin/python
from numpy import ctypeslib, ndarray, zeros
from ctypes import c_double, byref, cdll
from os import path
from sys import platform
path = path.dirname(path.realpath(__file__))
if 'linux' in platform:
mod_matrix_maker=cdll.LoadLibrary("%s/libmatrix.so" % path)

def myones(n,m):
A=ndarray((n,m),dtype='d')
mod_matrix_maker.ones_matrix(n,m,A.reshape(-1,1).ctypes.data)
return A
$ gdb -arg python ./test.py 
GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2) 7.3-2011.08
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /usr/bin/python...(no debugging symbols found)...done.
(gdb) start
Temporary breakpoint 1 at 0x41aa40
Starting program: /usr/bin/python ./test.py
[Thread debugging using libthread_db enabled]

Temporary breakpoint 1, 0x000000000041aa40 in main ()
(gdb) next
Single stepping until exit from function main,
which has no line number information.
0x00000000004ee1e0 in Py_Main ()
(gdb) next
Single stepping until exit from function Py_Main,
which has no line number information.

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff34bd5e2 in ones_matrix (n=200, m=200, mtx=0xf346e010) at libmatrix.c:11
11 *(mtx++)=(i+j)/2.;
$ pmap -d 7419
7419: /usr/bin/python ./test.py
Address Kbytes Mode Offset Device Mapping
0000000000400000 2252 r-x-- 0000000000000000 0fd:00000 python2.7
0000000000832000 4 r---- 0000000000232000 0fd:00000 python2.7
0000000000833000 420 rw--- 0000000000233000 0fd:00000 python2.7
000000000089c000 5184 rw--- 0000000000000000 000:00000 [ anon ]
00007ffff346e000 316 rw--- 0000000000000000 000:00000 [ anon ]
00007ffff34bd000 4 r-x-- 0000000000000000 0fd:00002 libmatrix.so
00007ffff34be000 2044 ----- 0000000000001000 0fd:00002 libmatrix.so
00007ffff36bd000 4 r---- 0000000000000000 0fd:00002 libmatrix.so
00007ffff36be000 4 rw--- 0000000000001000 0fd:00002 libmatrix.so
00007ffff36bf000 292 r-x-- 0000000000000000 0fd:00000 mtrand.so
00007ffff3708000 2048 ----- 0000000000049000 0fd:00000 mtrand.so
00007ffff3908000 4 r---- 0000000000049000 0fd:00000 mtrand.so
00007ffff3909000 112 rw--- 000000000004a000 0fd:00000 mtrand.so
00007ffff3925000 4 rw--- 0000000000000000 000:00000 [ anon ]
00007ffff3926000 36 r-x-- 0000000000000000 0fd:00000 fftpack_lite.so
00007ffff392f000 2044 ----- 0000000000009000 0fd:00000 fftpack_lite.so
00007ffff3b2e000 4 r---- 0000000000008000 0fd:00000 fftpack_lite.so
00007ffff3b2f000 4 rw--- 0000000000009000 0fd:00000 fftpack_lite.so
00007ffff3b30000 212 r-x-- 0000000000000000 0fd:00000 libquadmath.so.0.0.0
00007ffff3b65000 2044 ----- 0000000000035000 0fd:00000 libquadmath.so.0.0.0
00007ffff3d64000 4 r---- 0000000000034000 0fd:00000 libquadmath.so.0.0.0
00007ffff3d65000 4 rw--- 0000000000035000 0fd:00000 libquadmath.so.0.0.0
00007ffff3d66000 84 r-x-- 0000000000000000 0fd:00000 libgcc_s.so.1
00007ffff3d7b000 2044 ----- 0000000000015000 0fd:00000 libgcc_s.so.1
00007ffff3f7a000 4 r---- 0000000000014000 0fd:00000 libgcc_s.so.1
00007ffff3f7b000 4 rw--- 0000000000015000 0fd:00000 libgcc_s.so.1
00007ffff3f7c000 1104 r-x-- 0000000000000000 0fd:00000 libgfortran.so.3.0.0
00007ffff4090000 2044 ----- 0000000000114000 0fd:00000 libgfortran.so.3.0.0
00007ffff428f000 4 r---- 0000000000113000 0fd:00000 libgfortran.so.3.0.0
00007ffff4290000 8 rw--- 0000000000114000 0fd:00000 libgfortran.so.3.0.0
00007ffff4292000 9108 r-x-- 0000000000000000 0fd:00000 liblapack.so.3gf.0
00007ffff4b77000 2044 ----- 00000000008e5000 0fd:00000 liblapack.so.3gf.0
00007ffff4d76000 4 r---- 00000000008e4000 0fd:00000 liblapack.so.3gf.0
00007ffff4d77000 16 rw--- 00000000008e5000 0fd:00000 liblapack.so.3gf.0
00007ffff4d7b000 1076 rw--- 0000000000000000 000:00000 [ anon ]
00007ffff4e88000 20 r-x-- 0000000000000000 0fd:00000 lapack_lite.so
00007ffff4e8d000 2048 ----- 0000000000005000 0fd:00000 lapack_lite.so
00007ffff508d000 4 r---- 0000000000005000 0fd:00000 lapack_lite.so
00007ffff508e000 4 rw--- 0000000000006000 0fd:00000 lapack_lite.so
00007ffff508f000 16 r-x-- 0000000000000000 0fd:00000 _compiled_base.so
00007ffff5093000 2044 ----- 0000000000004000 0fd:00000 _compiled_base.so
00007ffff5292000 4 r---- 0000000000003000 0fd:00000 _compiled_base.so
00007ffff5293000 4 rw--- 0000000000004000 0fd:00000 _compiled_base.so
00007ffff5294000 772 rw--- 0000000000000000 000:00000 [ anon ]
00007ffff5355000 12 r-x-- 0000000000000000 0fd:00000 _heapq.so
00007ffff5358000 2044 ----- 0000000000003000 0fd:00000 _heapq.so
00007ffff5557000 4 r---- 0000000000002000 0fd:00000 _heapq.so
00007ffff5558000 8 rw--- 0000000000003000 0fd:00000 _heapq.so
00007ffff555a000 260 rw--- 0000000000000000 000:00000 [ anon ]
00007ffff559b000 152 r-x-- 0000000000000000 0fd:00000 scalarmath.so
00007ffff55c1000 2044 ----- 0000000000026000 0fd:00000 scalarmath.so
00007ffff57c0000 4 r---- 0000000000025000 0fd:00000 scalarmath.so
00007ffff57c1000 8 rw--- 0000000000026000 0fd:00000 scalarmath.so
00007ffff57c3000 612 r-x-- 0000000000000000 0fd:00000 libblas.so.3gf.0
00007ffff585c000 2044 ----- 0000000000099000 0fd:00000 libblas.so.3gf.0
00007ffff5a5b000 4 r---- 0000000000098000 0fd:00000 libblas.so.3gf.0
00007ffff5a5c000 4 rw--- 0000000000099000 0fd:00000 libblas.so.3gf.0
00007ffff5a5d000 20 r-x-- 0000000000000000 0fd:00000 _dotblas.so
00007ffff5a62000 2044 ----- 0000000000005000 0fd:00000 _dotblas.so
00007ffff5c61000 4 r---- 0000000000004000 0fd:00000 _dotblas.so
00007ffff5c62000 4 rw--- 0000000000005000 0fd:00000 _dotblas.so
00007ffff5c63000 84 r-x-- 0000000000000000 0fd:00000 _sort.so
00007ffff5c78000 2044 ----- 0000000000015000 0fd:00000 _sort.so
00007ffff5e77000 4 r---- 0000000000014000 0fd:00000 _sort.so
00007ffff5e78000 4 rw--- 0000000000015000 0fd:00000 _sort.so
00007ffff5e79000 304 r-x-- 0000000000000000 0fd:00000 umath.so
00007ffff5ec5000 2044 ----- 000000000004c000 0fd:00000 umath.so
00007ffff60c4000 4 r---- 000000000004b000 0fd:00000 umath.so
00007ffff60c5000 16 rw--- 000000000004c000 0fd:00000 umath.so
00007ffff60c9000 8 rw--- 0000000000000000 000:00000 [ anon ]
00007ffff60cb000 536 r-x-- 0000000000000000 0fd:00000 multiarray.so
00007ffff6151000 2044 ----- 0000000000086000 0fd:00000 multiarray.so
00007ffff6350000 4 r---- 0000000000085000 0fd:00000 multiarray.so
00007ffff6351000 44 rw--- 0000000000086000 0fd:00000 multiarray.so
00007ffff635c000 8 rw--- 0000000000000000 000:00000 [ anon ]
00007ffff635e000 124 r-x-- 0000000000000000 0fd:00000 _ctypes.so
00007ffff637d000 2048 ----- 000000000001f000 0fd:00000 _ctypes.so
00007ffff657d000 4 r---- 000000000001f000 0fd:00000 _ctypes.so
00007ffff657e000 16 rw--- 0000000000020000 0fd:00000 _ctypes.so
00007ffff6582000 4 rw--- 0000000000000000 000:00000 [ anon ]
00007ffff6583000 4072 r---- 0000000000000000 0fd:00000 locale-archive
00007ffff697d000 1620 r-x-- 0000000000000000 0fd:00000 libc-2.13.so
00007ffff6b12000 2044 ----- 0000000000195000 0fd:00000 libc-2.13.so
00007ffff6d11000 16 r---- 0000000000194000 0fd:00000 libc-2.13.so
00007ffff6d15000 4 rw--- 0000000000198000 0fd:00000 libc-2.13.so
00007ffff6d16000 24 rw--- 0000000000000000 000:00000 [ anon ]
00007ffff6d1c000 524 r-x-- 0000000000000000 0fd:00000 libm-2.13.so
00007ffff6d9f000 2044 ----- 0000000000083000 0fd:00000 libm-2.13.so
00007ffff6f9e000 4 r---- 0000000000082000 0fd:00000 libm-2.13.so
00007ffff6f9f000 4 rw--- 0000000000083000 0fd:00000 libm-2.13.so
00007ffff6fa0000 92 r-x-- 0000000000000000 0fd:00000 libz.so.1.2.3.4
00007ffff6fb7000 2044 ----- 0000000000017000 0fd:00000 libz.so.1.2.3.4
00007ffff71b6000 4 r---- 0000000000016000 0fd:00000 libz.so.1.2.3.4
00007ffff71b7000 4 rw--- 0000000000017000 0fd:00000 libz.so.1.2.3.4
00007ffff71b8000 1568 r-x-- 0000000000000000 0fd:00000 libcrypto.so.1.0.0
00007ffff7340000 2048 ----- 0000000000188000 0fd:00000 libcrypto.so.1.0.0
00007ffff7540000 100 r---- 0000000000188000 0fd:00000 libcrypto.so.1.0.0
00007ffff7559000 40 rw--- 00000000001a1000 0fd:00000 libcrypto.so.1.0.0
00007ffff7563000 16 rw--- 0000000000000000 000:00000 [ anon ]
00007ffff7567000 296 r-x-- 0000000000000000 0fd:00000 libssl.so.1.0.0
00007ffff75b1000 2044 ----- 000000000004a000 0fd:00000 libssl.so.1.0.0
00007ffff77b0000 12 r---- 0000000000049000 0fd:00000 libssl.so.1.0.0
00007ffff77b3000 20 rw--- 000000000004c000 0fd:00000 libssl.so.1.0.0
00007ffff77b8000 8 r-x-- 0000000000000000 0fd:00000 libutil-2.13.so
00007ffff77ba000 2044 ----- 0000000000002000 0fd:00000 libutil-2.13.so
00007ffff79b9000 4 r---- 0000000000001000 0fd:00000 libutil-2.13.so
00007ffff79ba000 4 rw--- 0000000000002000 0fd:00000 libutil-2.13.so
00007ffff79bb000 8 r-x-- 0000000000000000 0fd:00000 libdl-2.13.so
00007ffff79bd000 2048 ----- 0000000000002000 0fd:00000 libdl-2.13.so
00007ffff7bbd000 4 r---- 0000000000002000 0fd:00000 libdl-2.13.so
00007ffff7bbe000 4 rw--- 0000000000003000 0fd:00000 libdl-2.13.so
00007ffff7bbf000 96 r-x-- 0000000000000000 0fd:00000 libpthread-2.13.so
00007ffff7bd7000 2044 ----- 0000000000018000 0fd:00000 libpthread-2.13.so
00007ffff7dd6000 4 r---- 0000000000017000 0fd:00000 libpthread-2.13.so
00007ffff7dd7000 4 rw--- 0000000000018000 0fd:00000 libpthread-2.13.so
00007ffff7dd8000 16 rw--- 0000000000000000 000:00000 [ anon ]
00007ffff7ddc000 132 r-x-- 0000000000000000 0fd:00000 ld-2.13.so
00007ffff7e1c000 260 rw--- 0000000000000000 000:00000 [ anon ]
00007ffff7e5d000 4 rwx-- 0000000000000000 000:00000 [ anon ]
00007ffff7e5e000 780 rw--- 0000000000000000 000:00000 [ anon ]
00007ffff7f53000 540 rw--- 0000000000000000 000:00000 [ anon ]
00007ffff7ff9000 8 rw--- 0000000000000000 000:00000 [ anon ]
00007ffff7ffb000 4 r-x-- 0000000000000000 000:00000 [ anon ]
00007ffff7ffc000 4 r---- 0000000000020000 0fd:00000 ld-2.13.so
00007ffff7ffd000 8 rw--- 0000000000021000 0fd:00000 ld-2.13.so
00007ffffffcc000 204 rw--- 0000000000000000 000:00000 [ stack ]
ffffffffff600000 4 r-x-- 0000000000000000 000:00000 [ anon ]
mapped: 85000K writeable/private: 10260K shared: 0K
Андрей Светлов
потому что нужно учитывать strides — массив не обязан быть непрерывным в памяти. А лучше смотреть на .ctypes и не трогать .reshape.
nindza
Андрей Светлов
потому что нужно учитывать strides — массив не обязан быть непрерывным в памяти. А лучше смотреть на .ctypes и не трогать .reshape.
Можно поподробнее ?

удаление reshape не изменяет ситуации:
def myones(n,m):
A=ndarray((n,m),dtype='d')
mod_matrix_maker.ones_matrix(n,m,A.ctypes.data)
return A
Андрей Светлов
Stride: The distance (in bytes) between the two consecutive elements along an axis. Numpy expresses strides in bytes because the distance between elements is not necessarily a multiple of the element size.
Или нужно еще подробней?
nindza
Андрей Светлов
Stride: The distance (in bytes) between the two consecutive elements along an axis. Numpy expresses strides in bytes because the distance between elements is not necessarily a multiple of the element size.
Или нужно еще подробней?
ошибка сегментирования даже для вот такого кода возникает (при записи в самую первую позицию не нужно же учитывать stride):
void ones_matrix(.
const int n,.
const int m,.
double* mtx).
{
*mtx = 1.0;
}
Андрей Светлов
http://docs.python.org/py3k/library/ctypes.html?highlight=argtypes#ctypes._FuncPtr.argtypes
По умолчанию ctypes аргументы считает как int, насколько помню
Для amd64
sizeof(int) == 4
sizeof(long) == 8
sizeoof(void*) == 8
nindza
к сожалению со strides не прошло, при этом на 32-битных и 64-битных системах strides одинаковые значения имеет, ну и соответственно опять при трассировке указатель на первый элемент mtx обрезан на 64-битной.

$ cat libmatrix.c
#include<math.h>
#include<stdio.h>

void ones_matrix( const int n0, const int n1, const int s0, const int s1, double* mtx )
{
int byte_offset;
for(int i=0; i<n0; ++i)
for(int j=0; j<n1; ++j)
{
printf("i=%i j=%i n0=%i n1=%i s0=%i s1=%i\n",i,j,n0,n1,s0,s1);
byte_offset = s0*i + s1*j;
mtx[byte_offset] = (i+j)/2.;
}
}

$ cat matrix.py
#!/usr/bin/python
from numpy import ctypeslib, ndarray, zeros
from ctypes import c_double, byref, cdll
from os import path
from sys import platform
path = path.dirname(path.realpath(__file__))
if 'linux' in platform:
mod_matrix_maker=cdll.LoadLibrary("%s/libmatrix.so" % path)

def myones(n,m):
A=ndarray((n,m),dtype='d')
s0=A.strides[0]
s1=A.strides[1]
print "A.shape", A.shape
print "A.strides", A.strides
mod_matrix_maker.ones_matrix(n,m,s0,s1,A.ctypes.data)
return A

$ ../test/test.py
A.shape (400, 400)
A.strides (3200, 8)
i=0 j=0 n0=400 n1=400 s0=3200 s1=8
Ошибка сегментирования
nindza
Андрей Светлов
http://docs.python.org/py3k/library/ctypes.html?highlight=argtypes#ctypes._FuncPtr.argtypes
По умолчанию ctypes аргументы считает как int, насколько помню
Для amd64
sizeof(int) == 4
sizeof(long) == 8
sizeoof(void*) == 8
дошло !


mod_matrix_maker.ones_matrix(n,m,s0,s1, A.ctypes.data_as(POINTER(c_long)))
спасибо!


P.S. strides все таки нужно учитывать ?

здесь вопрос в чем, если писать так
$ cat libmatrix.c 
#include<math.h>
#include<stdio.h>

void ones_matrix( const int n0, const int n1, const int s0, const int s1, double* mtx )
{
int byte_offset;
int size_double = sizeof(double);
for(int i=0; i<n0; ++i)
for(int j=0; j<n1; ++j)
{
printf("i=%i j=%i n0=%i n1=%i s0=%i s1=%i\n",i,j,n0,n1,s0,s1);
byte_offset = s0*i + s1*j;
mtx[byte_offset/size_double] = (i+j)/2.;
}
}
то какая разница в таком смещении: здесь тоже смещение на sizeof(double):
                   *(mtx++) = (i+j)/2.;
или Питон может свое смещение устанавливать, например не 8 байт, а как-то неплотно, например 10 байт для каждого элемента?


или имеется ввиду что для массива n0xn1 мы может получить strides не с двумя измерениями , а с многими , как бы учитывающие хранение его не в непрерывной памяти. а в разрывной ?

или всетаки массив строго в непрерывной памяти хранится ?
Андрей Светлов
Нет гарантии, что без strides будет всегда и везде работать. Для оптимального выравнивания бывает полезно вставить пустые байты в конце строки, например. И т.д.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB