Re: [f2py] segmentation fault
Pearu Peterson <[email protected]> Tue, 02 Nov 2010 09:27:54 +0200
| Newsgroups | gmane.comp.python.f2py.user |
|---|---|
| Message-ID | <[email protected]> |
On 11/02/2010 08:54 AM, Xavier Barthelemy wrote: > Hi again > > this example was to explain my question > > actutally to reproduce the crash, i need to fill the memory, hmm, I would expect crashes when computer doesn't have enough memory (ram+cache). > so the example is nor simple nor didactical. I'll try it .... > If the new version of f2py does not change anything, I'll try to make > a minimalist crashing example, but I am not sure it will be so > minimalist nor you would like to debug the code. thanks again My interest in debugging your code is to find bugs in f2py. Also, a crashing example would be more effective in getting support from the ml, I think. Best regards, Pearu > 2010/11/2 Pearu Peterson<[email protected]>: >> Hi, >> >> I am not able to reproduce crashes with the following code: >> >> subroutine toto(n1,n2,toto1) >> >> implicit none >> integer*4 :: n1,n2,n3 >> real*8 :: toto1(n1,n2) >> real*8, allocatable :: toto2(:,:) >> !f2py integer(4) intend(in),depend(toto1)::n1 >> !f2py integer(4) intend(in),depend(toto1)::n2 >> !f2py real(8) dimension(n1,n2) intent(in) :: toto1 >> !f2py n1=shape(toto1,0) >> !f2py n2=shape(toto1,1) >> >> n3= 3 >> allocate(toto2(n1,n3)) >> >> return >> end subroutine toto >> >> Can you give a "working" example that crashes? >> >> Few additional notes: since toto2 is not in the argument list, f2py does not use >> any information of it, so, do not use it within f2py directives. >> Also, the toto allocates toto2, but does it also deallocates it? >> >> >> On Mon, Nov 1, 2010 at 3:41 AM, Xavier Barthelemy<[email protected]> wrote: >> ... >>> the code does a seg fault after a few iteration, that means I am >>> reading/writing outside of where i am supposed to do so. >>> >>> my fortran variable declaration is okey >>> my f2py statement is ok >>> >>> I run f2py with these options: >>> --debug-capi -DF2PY_REPORT_ATEXIT -DF2PY_REPORT_ON_ARRAY_COPY=1 >>> -DDEBUG_COPY_ND_ARRAY >>> and the fortran compiler with every debug options -check all -debug >>> all -diag-enable -C -warn >>> >>> all the debug and check_and_fix are ok when I call the subroutine from python >>> the arrays in python are created fortran ordered. >>> >>> and i still have a seg fault and it's not about accessing a bad array >>> index in the fortran code >>> >>> so my question is how can i debug this type of errors? >>> sometimes, when it runs but segfault on the return from fortran to >>> python I have a bad pointer allocation message with a memroy address. >>> How can i use that? how can i have access to the name of what it is >>> pointing? >> >> You can use tools like ddd or gdb to find the location of segfaults. >> For example, >> run >> >> ulimit -c unlimited # this will ensure that core file will be created >> on segfault >> python test.py # crash should create core to cwd. >> gdb python core >> (gdb) run test.py >> >>> I have to say that wrinting/commenting some lines to find out where it >>> stops change the place of crash in the code. >>> >>> What can be my tools to find out what is happening? >>> >>> something came to my mind too. do i have to do a f2py statement for a >>> local fortran variable which the size depends on a entering parameter? >>> I'll explain >>> >>> subroutine toto(n1,n2,toto1) >>> >>> implicit none >>> integer*4 :: n1,n2,n3 >>> real*8 :: toto1(n1,n2) >>> real*8, allocatable :: toto2(:,:) >>> !f2py integer(4) intend(in),depend(toto1)::n1 >>> !f2py integer(4) intend(in),depend(toto1)::n2 >>> !f2py real(8) dimension(n1,n2) intent(in) :: toto1 >>> !f2py n1=shape(toto1,0) >>> !f2py n2=shape(toto1,1) >>> >>> n3= blah >>> allocate(toto2(n1,n3)) >>> >>> blahblah >>> return >>> end >>> >>> and in python i have >>> toto1=numpy.empty([n1,n2], dtype='d',order='FORTRAN') >>> >>> and i call module.toto(n1,n2,toto1) >>> >>> So should I replace the 1st f2py line by >>> !f2py integer(4) intend(in),depend(toto1,toto2)::n1 >>> and add >>> !f2py n1=shape(toto2,0) >> >> No, the n1=shape(toto2,0) would be evaluated before calling toto, so >> it would not work. >> >>> by the way I experimentally figured out that the old fortran >>> convention to order the variables in calling a subroutine has >>> sometimes an influence on having some wrapping errors or not >>> like subroutine toto( integer first, then arrays) >> >> f2py may change the signatures of Fortran functions when seen from >> Python side. So, always check the __doc__ of generated wrappers. >> More details can be found in the f2py paper. >> >> HTH, >> Pearu >> >> _______________________________________________ >> f2py-users mailing list >> f2py-users-Y4l6ocDipWCuvFJfX82//[email protected] >> http://cens.ioc.ee/mailman/listinfo/f2py-users >> > > _______________________________________________ > f2py-users mailing list > f2py-users-Y4l6ocDipWCuvFJfX82//[email protected] > http://cens.ioc.ee/mailman/listinfo/f2py-users