I don't know why valgrind is not putting in line numbers but something is 
clearly very wrong with data structure initialization. I am not sure if it is 
really directly related to PETSc but somehow comes about in the C++ constructor 
business, which seems simple enough in your code but I don't understand. When 
working with MPI and C++ one must be careful that no constructors of global 
objects that reference MPI get called before MPI is initialized but that 
doesn't seem to be happening in your code.

  Sorry, I can debug it but I have no clue how to build your code it seems to 
use  "armadillo-matrices" stuff that somehow doesn't come in through any 
include files or libraries. If you gave me a full makefile that builds 
everything I might be able to build it.

> On Apr 1, 2022, at 9:56 AM, Roland Richter <[email protected]> wrote:
> 
> Hei,
> 
> It defines the namespace used for armadillo-matrices. A valgrind-log is 
> attached for the case with removed destructor (can't run valgrind if my 
> program fails with a segfault).
> 
> Regards,
> 
> Roland
> 
> Am 01.04.22 um 15:23 schrieb Barry Smith:
>> 
>>   I recommend first running with valgrind. 
>> 
>>   I tried to build your code but got compile errors from arma:: being 
>> unknown. Where does it come from? Is it only in a super new version of Boost?
>> 
>> 
>> 
>>> On Apr 1, 2022, at 6:50 AM, Roland Richter <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>> 
>>> I re-run my code with a debug version of PETSc, resulting in 
>>> 
>>> [0]PETSC ERROR: --------------------- Error Message 
>>> -------------------------------------------------------------- 
>>> [0]PETSC ERROR: Corrupt argument: https://petsc.org/release/faq/#valgrind 
>>> <https://petsc.org/release/faq/#valgrind> 
>>> [0]PETSC ERROR: Object already free: Parameter # 1 
>>> [0]PETSC ERROR: See https://petsc.org/release/faq/ 
>>> <https://petsc.org/release/faq/> for trouble shooting. 
>>> [0]PETSC ERROR: Petsc Development GIT revision: v3.17.0-8-gf6d6129e50  GIT 
>>> Date: 2022-03-31 18:10:33 +0000 
>>> [0]PETSC ERROR: #1 VecGetSize() at 
>>> /home/roland/Downloads/git-files/petsc/src/vec/vec/interface/vector.c:670
>>> 0       64 
>>> [0]PETSC ERROR: #2 VecDestroy() at 
>>> /home/roland/Downloads/git-files/petsc/src/vec/vec/interface/vector.c:375
>>> 0       64 
>>> [0]PETSC ERROR: #3 VecGetArray() at 
>>> /home/roland/Downloads/git-files/petsc/src/vec/vec/interface/rvector.c:1780
>>> 
>>> 
>>> I do not understand why it tries to access the vector, even though it has 
>>> been set to PETSC_NULL in the previous free-call.
>>> 
>>> Regards,
>>> 
>>> Roland
>>> 
>>> Am 31.03.22 um 15:50 schrieb Matthew Knepley:
>>>> On Thu, Mar 31, 2022 at 9:47 AM Roland Richter <[email protected] 
>>>> <mailto:[email protected]>> wrote:
>>>> The backtrace is
>>>> 
>>>> #0  0x00007fffeec4ba97 in VecGetSize_Seq () from 
>>>> /opt/petsc/lib/libpetsc.so.3.016 
>>>> #1  0x00007fffeec78f5a in VecGetSize () from 
>>>> /opt/petsc/lib/libpetsc.so.3.016 
>>>> #2  0x0000000000410b73 in 
>>>> test_ts_arma_with_pure_petsc_preconfigured_clean(unsigned long, unsigned 
>>>> long, arma::Col<std::complex<doubl
>>>> e> > const&, arma::Col<std::complex<double> >&, double, double, double) 
>>>> [clone .constprop.0] () 
>>>> #3  0x0000000000414384 in test_RK4_solvers_clean(unsigned long, unsigned 
>>>> long, unsigned long, bool) [clone .constprop.0] () 
>>>> #4  0x0000000000405c6c in main ()
>>>> 
>>>> It looks like you are passing an invalid vector. If you compiled in debug 
>>>> mode, it would tell you. I would run
>>>> in debug until my code was running like I expect, then switch to 
>>>> optimized. You can do that by using two
>>>> different PETSC_ARCH configures, and switch at runtime with that variable.
>>>> 
>>>>   Thanks,
>>>> 
>>>>     Matt 
>>>> Regards,
>>>> 
>>>> Roland Richter
>>>> 
>>>> Am 31.03.22 um 15:35 schrieb Matthew Knepley:
>>>>> On Thu, Mar 31, 2022 at 9:01 AM Roland Richter <[email protected] 
>>>>> <mailto:[email protected]>> wrote:
>>>>> Hei,
>>>>> 
>>>>> Thanks for the idea! I added a simple std::cout for both constructor and 
>>>>> destructor, and found out that my destructor is called multiple times, 
>>>>> while the constructor is called only once. This could explain the error 
>>>>> (double free), but I do not know why segfault is thrown even though I 
>>>>> explicitly check if the vector has been used. Are there explanations for 
>>>>> that?
>>>>> 
>>>>> Run with -start_in_debugger and get the stack trace when it faults. Right 
>>>>> now, I have no idea where it is faulting.
>>>>> 
>>>>>   Thanks,
>>>>> 
>>>>>     Matt
>>>>>  
>>>>> Regards,
>>>>> 
>>>>> Roland Richter
>>>>> 
>>>>> Am 31.03.22 um 12:14 schrieb Matthew Knepley:
>>>>>> On Thu, Mar 31, 2022 at 5:58 AM Roland Richter <[email protected] 
>>>>>> <mailto:[email protected]>> wrote:
>>>>>> Hei,
>>>>>> 
>>>>>> For a project I wanted to combine boost::odeint for timestepping and 
>>>>>> PETSc-based vectors and matrices for calculating the right hand side. As 
>>>>>> comparison for both timing and correctness I set up an armadillo-based 
>>>>>> right hand side (with the main-function being in main.cpp, and the test 
>>>>>> code in test_timestepping_clean.cpp)
>>>>>> 
>>>>>> In theory, the code works fine, but I have some issues with cleaning up 
>>>>>> afterwards in my struct Petsc_RHS_state_clean. My initial intention was 
>>>>>> to set up all involved matrices and vectors within the constructor, and 
>>>>>> free the memory in the destructor. To avoid freeing vectors I have not 
>>>>>> used I initially set them to PETSC_NULL, and check if this value has 
>>>>>> been changed before calling VecDestroy().
>>>>>> 
>>>>>> You do not need to check. Destroy() functions already check for NULL.
>>>>>> However, when doing that I get the following error:
>>>>>> 
>>>>>> [0]PETSC ERROR: 
>>>>>> ------------------------------------------------------------------------ 
>>>>>> [0]PETSC ERROR: Caught signal number 11 SEGV: Segmentation Violation, 
>>>>>> probably memory access out of range 
>>>>>> [0]PETSC ERROR: Try option -start_in_debugger or 
>>>>>> -on_error_attach_debugger 
>>>>>> [0]PETSC ERROR: or see https://petsc.org/release/faq/#valgrind 
>>>>>> <https://petsc.org/release/faq/#valgrind> 
>>>>>> [0]PETSC ERROR: or try http://valgrind.org <http://valgrind.org/> on 
>>>>>> GNU/linux and Apple Mac OS X to find memory corruption errors 
>>>>>> [0]PETSC ERROR: configure using --with-debugging=yes, recompile, link, 
>>>>>> and run  
>>>>>> [0]PETSC ERROR: to get more information on the crash. 
>>>>>> [0]PETSC ERROR: --------------------- Error Message 
>>>>>> --------------------------------------------------------------
>>>>>> 
>>>>>> If I comment out that code in ~Petsc_RHS_state_clean(), the program 
>>>>>> runs, but will use ~17 GByte of RAM during runtime. As the memory is not 
>>>>>> used immediately in full, but rather increases during running, I assume 
>>>>>> a memory leak somewhere. Where does it come from, and how can I avoid it?
>>>>>> 
>>>>>> It must be that your constructor is called multiple times without 
>>>>>> calling your destructor. I cannot understand this code in order
>>>>>> to see where that happens, but you should just be able to run in the 
>>>>>> debugger and put a break point at the creation and
>>>>>> destruction calls.
>>>>>> 
>>>>>>   Thanks,
>>>>>> 
>>>>>>       Matt
>>>>>> Thanks!
>>>>>> 
>>>>>> Regards,
>>>>>> 
>>>>>> Roland Richter
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> -- 
>>>>>> What most experimenters take for granted before they begin their 
>>>>>> experiments is infinitely more interesting than any results to which 
>>>>>> their experiments lead.
>>>>>> -- Norbert Wiener
>>>>>> 
>>>>>> https://www.cse.buffalo.edu/~knepley/ 
>>>>>> <http://www.cse.buffalo.edu/~knepley/>
>>>>> 
>>>>> 
>>>>> -- 
>>>>> What most experimenters take for granted before they begin their 
>>>>> experiments is infinitely more interesting than any results to which 
>>>>> their experiments lead.
>>>>> -- Norbert Wiener
>>>>> 
>>>>> https://www.cse.buffalo.edu/~knepley/ 
>>>>> <http://www.cse.buffalo.edu/~knepley/>
>>>> 
>>>> 
>>>> -- 
>>>> What most experimenters take for granted before they begin their 
>>>> experiments is infinitely more interesting than any results to which their 
>>>> experiments lead.
>>>> -- Norbert Wiener
>>>> 
>>>> https://www.cse.buffalo.edu/~knepley/ 
>>>> <http://www.cse.buffalo.edu/~knepley/>
>> 
> <out_file.txt>

Reply via email to