Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

proj_create_operations intermittent failures #1736

Closed
nyalldawson opened this issue Nov 22, 2019 · 14 comments
Closed

proj_create_operations intermittent failures #1736

nyalldawson opened this issue Nov 22, 2019 · 14 comments
Assignees

Comments

@nyalldawson
Copy link
Contributor

I've struggled to narrow down the situation which triggers this, but unfortunately this is the best I can get....

Given the following code:

  PJ_CONTEXT *c = ...; // something, see below!
  PJ_OPERATION_FACTORY_CONTEXT *operationContext = proj_create_operation_factory_context( c, nullptr );
  proj_operation_factory_context_set_grid_availability_use( c, operationContext, PROJ_GRID_AVAILABILITY_IGNORED );
  proj_operation_factory_context_set_spatial_criterion( c, operationContext,  PROJ_SPATIAL_CRITERION_PARTIAL_INTERSECTION );
  PJ *src = proj_create_from_database( c, "EPSG", "3035", PJ_CATEGORY_CRS, false, nullptr );
  PJ *dest = proj_create_from_database( c, "EPSG", "5514", PJ_CATEGORY_CRS, false, nullptr );
  if ( PJ_OBJ_LIST *ops = proj_create_operations( c, src, dest, operationContext ) )
  {
    // all good!
  }
  else
  {
    // BAD!
    assert( false );
  }

I hit random behavior where sometimes this fails, and other times it correctly returns a handful of results.

From what I've been able to debug:

  1. If I use a brand new context whenever I call this (PJ_CONTEXT *c = proj_context_create();) then there's never an issue, and the operations are always returned.

  2. If I use an existing context, or a nullptr for the context, then sometimes the call fails with the error internal_proj_create_operations: At least one of the operation lacks a source and/or target CRS

It seems like some other operation performed using the context prior to this call is leaving it in an inconsistent state.

Although I can't 100% confirm it, I think this is caused by the following sequence of events:

  1. Using a context, use proj_create_operations (as above) to get all operations between -s EPSG:3035 -t EPSG:5514.

  2. iterate through these operations using proj_list_get. For each, call proj_as_proj_string.

  3. Some of the operations fail to export to proj, with the error: "Unimplemented" (maybe due to missing grids locally?)

  4. Using the SAME context, try to repeat the call to proj_create_operations at some later stage -- the operation fails

This issue is the underlying cause of qgis/QGIS#30569 (comment)

@rouault rouault self-assigned this Nov 22, 2019
@rouault
Copy link
Member

rouault commented Nov 22, 2019

Trying to reproduce...

@rouault
Copy link
Member

rouault commented Nov 22, 2019

@nyalldawson I'm unfortunately unsuccessful to reproduce. I've create the below test code from your indications, and added threading as well just in case. The "Unimplemented" error you get on the last 2 operations is expected given that EPSG lists 2 grids unknown of PROJ

#include "proj.h"
#include <assert.h>
#include <stdio.h>
#include <thread>

void f(PJ_CONTEXT *c)
{
  PJ_OPERATION_FACTORY_CONTEXT *operationContext = proj_create_operation_factory_context( c, nullptr );
  proj_operation_factory_context_set_grid_availability_use( c, operationContext, PROJ_GRID_AVAILABILITY_IGNORED );
  proj_operation_factory_context_set_spatial_criterion( c, operationContext,  PROJ_SPATIAL_CRITERION_PARTIAL_INTERSECTION );
  PJ *src = proj_create_from_database( c, "EPSG", "3035", PJ_CATEGORY_CRS, false, nullptr );
  PJ *dest = proj_create_from_database( c, "EPSG", "5514", PJ_CATEGORY_CRS, false, nullptr );
  //PJ *src = proj_create_from_database( c, "EPSG", "3059", PJ_CATEGORY_CRS, false, nullptr );
  //PJ *dest = proj_create_from_database( c, "EPSG", "4326", PJ_CATEGORY_CRS, false, nullptr );
  //PJ *src = proj_create_from_database( c, "EPSG", "3908", PJ_CATEGORY_CRS, false, nullptr );
  //PJ *dest = proj_create_from_database( c, "EPSG", "3908", PJ_CATEGORY_CRS, false, nullptr );
  if ( PJ_OBJ_LIST *ops = proj_create_operations( c, src, dest, operationContext ) )
  {
    int count = proj_list_get_count(ops);
    for(int i = 0; i < count; i++ )
    {
        PJ* op = proj_list_get(c, ops, i);
        const char* proj_str = proj_as_proj_string(c, op, PJ_PROJ_5, nullptr);
        //printf("%d: %s\n", i, proj_str ? proj_str : "null_result");
        proj_destroy(op);
    }
    proj_list_destroy(ops);
  }
  else
  {
    // BAD!
    assert( false );
  }
  proj_destroy(src);
  proj_destroy(dest);
  proj_operation_factory_context_destroy(operationContext);
}


void thread_function()
{
    PJ_CONTEXT *c = proj_context_create();
    while(1)
        f(c);
}

int main()
{
    std::thread t1(thread_function);
    std::thread t2(thread_function);
    t1.join();
    t2.join();

    return 0;
}

But... from the errors mentionned in the QGIS tickets, I have suspected some black-magic inside PROJ. PROJ C++ geodetic-related objects (CRS, CoordinateOperation, etc..) are immutable... Mostly... That is: user code normally cannot mutate them by using public methods, but internal PROJ code in some parts for complex reasons has to mutate them sometimes (using protected methods and friend class to limit the callers). Actually this is limited to hacking the source and target CRS of CoordinateOperation objects, for the purpose of chaining them together in a ConcatenatedOperation. Where this could fail is if it mutates objects that are cached (the DatabaseContext c++ object that is attached to a PJ_CONTEXT has a cache of direct coordinate operations for CRS A -> CRS B transformations). Normally PROJ takes measures to create a "shallow clone" before mutating objects that could potentially be cached, so that the cached objects are not mutated. But of course there might be code paths where this has been overlooked... I've added an extra debug sanity check in https://github.com/rouault/PROJ/tree/6.2.1_with_immutable_flag_checker which is plain 6.2.1 with rouault@264b0b5 applied on top of it. The added assertion doesn't fail when running the PROJ autotest suite or the above reproducer attempt, but QGIS use cases might trigger other situations, so perhaps try to run QGIS with this instrumented version

@nyalldawson
Copy link
Contributor Author

Thanks @rouault , I'll test with that. Fwiw I don't think threading is an issue here - I've been able to reproduce with single thread access alone.

@rouault
Copy link
Member

rouault commented Nov 22, 2019

I've been able to reproduce with single thread access alone.

How do you reproduce with QGIS ? I tried the project attached in qgis/QGIS#30569 (comment) but works fine for me with a QGIS master from 2 weeks ago or so and PROJ master (non instrumented)

@rouault
Copy link
Member

rouault commented Nov 22, 2019

rouault@264b0b5 applies cleanly on top of PROJ master as well. I've just given it a try with the project attached in qgis/QGIS#30569 (comment) and the assert doesn't trigger

@rouault
Copy link
Member

rouault commented Nov 22, 2019

update: I've identified a related issue, in GDAL, with a proposed fix in OSGeo/gdal#2047. I'm not sure that this fix actually fixes the issue people see in practice in QGIS...

@rouault
Copy link
Member

rouault commented Nov 24, 2019

@nyalldawson You might want to try very latest PROJ master (or apply 875aba7 on top of 6.2.1). I couldn't raise this issue with current code however, which doesn't mean that this couldn't be hit... but found that while working on optimizations.

@nyalldawson
Copy link
Contributor Author

nyalldawson commented Nov 25, 2019

Will test with master shortly. In the meantime, here's a full backtrace from the point the exception is raised:

Thread 24 (Thread 0x7fff7dffb700 (LWP 367305)):
#0  0x00007fffec039d45 in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fffec448950 in std::condition_variable::wait(std::unique_lock<std::mutex>&) () at /lib64/libstdc++.so.6
#2  0x00007ffff2596c51 in bmalloc::AsyncTask<bmalloc::Heap, void (bmalloc::Heap::*)()>::threadRunLoop() () at /lib64/libQt5WebKit.so.5
#3  0x00007ffff2596d8f in  () at /lib64/libQt5WebKit.so.5
#4  0x00007fffec44e6f4 in execute_native_thread_routine () at /lib64/libstdc++.so.6
#5  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#6  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 20 (Thread 0x7fff7ffff700 (LWP 367300)):
#0  0x00007fffec144a6f in poll () at /lib64/libc.so.6
#1  0x00007fffeaf5d79e in g_main_context_iterate.isra () at /lib64/libglib-2.0.so.0
#2  0x00007fffeaf5d8d3 in g_main_context_iteration () at /lib64/libglib-2.0.so.0
#3  0x00007fffec82acb5 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt5Core.so.5
#4  0x00007fffec7d4ceb in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt5Core.so.5
#5  0x00007fffec62d395 in QThread::exec() () at /lib64/libQt5Core.so.5
#6  0x00007fffec62e4e6 in QThreadPrivate::start(void*) () at /lib64/libQt5Core.so.5
#7  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#8  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 19 (Thread 0x7fff9caf4700 (LWP 367299)):
#0  0x00007fffec144a6f in poll () at /lib64/libc.so.6
#1  0x00007fffeaf5d79e in g_main_context_iterate.isra () at /lib64/libglib-2.0.so.0
#2  0x00007fffeaf5d8d3 in g_main_context_iteration () at /lib64/libglib-2.0.so.0
#3  0x00007fffec82acb5 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt5Core.so.5
#4  0x00007fffec7d4ceb in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt5Core.so.5
#5  0x00007fffef9a6e81 in QCA::SyncThread::run() () at /lib64/libqca-qt5.so.2
#6  0x00007fffec62e4e6 in QThreadPrivate::start(void*) () at /lib64/libQt5Core.so.5
#7  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#8  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 18 (Thread 0x7fff9dffb700 (LWP 367293)):
#0  0x00007fffec039d45 in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fffc92f0ebb in util_queue_thread_func () at /usr/lib64/dri/radeonsi_dri.so
#2  0x00007fffc92f0acb in impl_thrd_routine () at /usr/lib64/dri/radeonsi_dri.so
#3  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#4  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 17 (Thread 0x7fff9e7fc700 (LWP 367292)):
#0  0x00007fffec039d45 in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fffc92f0ebb in util_queue_thread_func () at /usr/lib64/dri/radeonsi_dri.so
#2  0x00007fffc92f0acb in impl_thrd_routine () at /usr/lib64/dri/radeonsi_dri.so
#3  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#4  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 16 (Thread 0x7fff9effd700 (LWP 367291)):
#0  0x00007fffec039d45 in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fffc92f0ebb in util_queue_thread_func () at /usr/lib64/dri/radeonsi_dri.so
#2  0x00007fffc92f0acb in impl_thrd_routine () at /usr/lib64/dri/radeonsi_dri.so
#3  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#4  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 15 (Thread 0x7fff9f7fe700 (LWP 367290)):
#0  0x00007fffec039d45 in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fffc92f0ebb in util_queue_thread_func () at /usr/lib64/dri/radeonsi_dri.so
#2  0x00007fffc92f0acb in impl_thrd_routine () at /usr/lib64/dri/radeonsi_dri.so
#3  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#4  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 14 (Thread 0x7fff9ffff700 (LWP 367289)):
#0  0x00007fffec039d45 in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fffc92f0ebb in util_queue_thread_func () at /usr/lib64/dri/radeonsi_dri.so
#2  0x00007fffc92f0acb in impl_thrd_routine () at /usr/lib64/dri/radeonsi_dri.so
#3  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#4  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 13 (Thread 0x7fffb4a8c700 (LWP 367288)):
#0  0x00007fffec039d45 in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fffc92f0ebb in util_queue_thread_func () at /usr/lib64/dri/radeonsi_dri.so
#2  0x00007fffc92f0acb in impl_thrd_routine () at /usr/lib64/dri/radeonsi_dri.so
#3  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#4  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 12 (Thread 0x7fffb528d700 (LWP 367287)):
#0  0x00007fffec039d45 in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fffc92f0ebb in util_queue_thread_func () at /usr/lib64/dri/radeonsi_dri.so
#2  0x00007fffc92f0acb in impl_thrd_routine () at /usr/lib64/dri/radeonsi_dri.so
#3  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#4  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 11 (Thread 0x7fffb5a8e700 (LWP 367286)):
#0  0x00007fffec039d45 in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fffc92f0ebb in util_queue_thread_func () at /usr/lib64/dri/radeonsi_dri.so
#2  0x00007fffc92f0acb in impl_thrd_routine () at /usr/lib64/dri/radeonsi_dri.so
#3  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#4  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 10 (Thread 0x7fffb628f700 (LWP 367285)):
#0  0x00007fffec039d45 in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fffc92f0ebb in util_queue_thread_func () at /usr/lib64/dri/radeonsi_dri.so
#2  0x00007fffc92f0acb in impl_thrd_routine () at /usr/lib64/dri/radeonsi_dri.so
#3  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#4  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 9 (Thread 0x7fffb6a90700 (LWP 367284)):
#0  0x00007fffec039d45 in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fffc92f0ebb in util_queue_thread_func () at /usr/lib64/dri/radeonsi_dri.so
#2  0x00007fffc92f0acb in impl_thrd_routine () at /usr/lib64/dri/radeonsi_dri.so
#3  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#4  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 8 (Thread 0x7fffb7291700 (LWP 367283)):
#0  0x00007fffec039d45 in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fffc92f0ebb in util_queue_thread_func () at /usr/lib64/dri/radeonsi_dri.so
#2  0x00007fffc92f0acb in impl_thrd_routine () at /usr/lib64/dri/radeonsi_dri.so
#3  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#4  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 7 (Thread 0x7fffc8a99700 (LWP 367282)):
#0  0x00007fffec039d45 in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fffc92f0ebb in util_queue_thread_func () at /usr/lib64/dri/radeonsi_dri.so
#2  0x00007fffc92f0acb in impl_thrd_routine () at /usr/lib64/dri/radeonsi_dri.so
#3  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#4  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 6 (Thread 0x7fffcb7fe700 (LWP 367280)):
#0  0x00007fffec144a6f in poll () at /lib64/libc.so.6
#1  0x00007fffeaf5d79e in g_main_context_iterate.isra () at /lib64/libglib-2.0.so.0
#2  0x00007fffeaf5d8d3 in g_main_context_iteration () at /lib64/libglib-2.0.so.0
#3  0x00007fffec82acb5 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt5Core.so.5
#4  0x00007fffec7d4ceb in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt5Core.so.5
#5  0x00007fffec62d395 in QThread::exec() () at /lib64/libQt5Core.so.5
#6  0x00007ffff6062f4a in QDBusConnectionManager::run() () at /lib64/libQt5DBus.so.5
#7  0x00007fffec62e4e6 in QThreadPrivate::start(void*) () at /lib64/libQt5Core.so.5
#8  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#9  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 5 (Thread 0x7fffcbfff700 (LWP 367279)):
#0  0x00007fffec144a6f in poll () at /lib64/libc.so.6
#1  0x00007fffeaf5d79e in g_main_context_iterate.isra () at /lib64/libglib-2.0.so.0
#2  0x00007fffeaf5db23 in g_main_loop_run () at /lib64/libglib-2.0.so.0
#3  0x00007fffeb53f70a in gdbus_shared_thread_func () at /lib64/libgio-2.0.so.0
#4  0x00007fffeaf86f52 in g_thread_proxy () at /lib64/libglib-2.0.so.0
#5  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#6  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 4 (Thread 0x7fffd8b45700 (LWP 367278)):
#0  0x00007fffec144a6f in poll () at /lib64/libc.so.6
#1  0x00007fffeaf5d79e in g_main_context_iterate.isra () at /lib64/libglib-2.0.so.0
#2  0x00007fffeaf5d8d3 in g_main_context_iteration () at /lib64/libglib-2.0.so.0
#3  0x00007fffdabaf93d in dconf_gdbus_worker_thread () at /usr/lib64/gio/modules/libdconfsettings.so
#4  0x00007fffeaf86f52 in g_thread_proxy () at /lib64/libglib-2.0.so.0
#5  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#6  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 3 (Thread 0x7fffd9346700 (LWP 367277)):
#0  0x00007fffec144a6f in poll () at /lib64/libc.so.6
#1  0x00007fffeaf5d79e in g_main_context_iterate.isra () at /lib64/libglib-2.0.so.0
#2  0x00007fffeaf5d8d3 in g_main_context_iteration () at /lib64/libglib-2.0.so.0
#3  0x00007fffeaf5d921 in glib_worker_main () at /lib64/libglib-2.0.so.0
#4  0x00007fffeaf86f52 in g_thread_proxy () at /lib64/libglib-2.0.so.0
#5  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#6  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 2 (Thread 0x7fffda8e2700 (LWP 367276)):
#0  0x00007fffec144a6f in poll () at /lib64/libc.so.6
#1  0x00007fffe85c338a in _xcb_conn_wait () at /lib64/libxcb.so.1
#2  0x00007fffe85c4fea in xcb_wait_for_event () at /lib64/libxcb.so.1
#3  0x00007fffdaa6dac8 in QXcbEventQueue::run() () at /lib64/libQt5XcbQpa.so.5
#4  0x00007fffec62e4e6 in QThreadPrivate::start(void*) () at /lib64/libQt5Core.so.5
#5  0x00007fffec0334e2 in start_thread () at /lib64/libpthread.so.0
#6  0x00007fffec14f693 in clone () at /lib64/libc.so.6

Thread 1 (Thread 0x7fffe7bb0280 (LWP 367272)):
#0  osgeo::proj::operation::ConcatenatedOperation::create(osgeo::proj::util::PropertyMap const&, std::vector<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> >, std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > > > const&, std::vector<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::metadata::PositionalAccuracy> >, std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::metadata::PositionalAccuracy> > > > const&) (properties=..., operationsIn=..., accuracies=...) at iso19111/coordinateoperation.cpp:9623
        l_sourceCRS = {<std::__shared_ptr<osgeo::proj::crs::CRS, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<osgeo::proj::crs::CRS, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x0, _M_refcount = {_M_pi = 0x0}}, <No data fields>}
        l_targetCRS = {<std::__shared_ptr<osgeo::proj::crs::CRS, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<osgeo::proj::crs::CRS, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x0, _M_refcount = {_M_pi = 0x0}}, <No data fields>}
        i = 0
        lastTargetCRS = {<std::__shared_ptr<osgeo::proj::crs::CRS, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<osgeo::proj::crs::CRS, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x0, _M_refcount = {_M_pi = 0x0}}, <No data fields>}
        op = {ptr = {<std::__shared_ptr<osgeo::proj::operation::ConcatenatedOperation, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<osgeo::proj::operation::ConcatenatedOperation, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x7fffffff99e0, _M_refcount = {_M_pi = 0x7fffffff99e0}}, <No data fields>}}
#1  0x00007fffef4f1b55 in osgeo::proj::operation::ConcatenatedOperation::createComputeMetadata(std::vector<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> >, std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > > > const&, bool) (operationsIn=..., checkExtent=false) at iso19111/coordinateoperation.cpp:9927
        properties = {d = {_M_t = {_M_t = {<std::_Tuple_impl<0, osgeo::proj::util::PropertyMap::Private*, std::default_delete<osgeo::proj::util::PropertyMap::Private> >> = {<std::_Tuple_impl<1, std::default_delete<osgeo::proj::util::PropertyMap::Private> >> = {<std::_Head_base<1, std::default_delete<osgeo::proj::util::PropertyMap::Private>, true>> = {<std::default_delete<osgeo::proj::util::PropertyMap::Private>> = {<No data fields>}, <No data fields>}, <No data fields>}, <std::_Head_base<0, osgeo::proj::util::PropertyMap::Private*, false>> = {_M_head_impl = 0x2290370}, <No data fields>}, <No data fields>}}}}
        flattenOps = {<std::_Vector_base<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> >, std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > > >> = {_M_impl = {<std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > >> = {<__gnu_cxx::new_allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > >> = {<No data fields>}, <No data fields>}, <std::_Vector_base<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> >, std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > > >::_Vector_impl_data> = {_M_start = 0x4b04380, _M_finish = 0x4b043b0, _M_end_of_storage = 0x4b043c0}, <No data fields>}}, <No data fields>}
        hasBallparkTransformation = false
        emptyIntersection = false
        extent = {<std::__shared_ptr<osgeo::proj::metadata::Extent, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<osgeo::proj::metadata::Extent, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x4505ff0, _M_refcount = {_M_pi = 0x4505a10}}, <No data fields>}
        accuracies = {<std::_Vector_base<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::metadata::PositionalAccuracy> >, std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::metadata::PositionalAccuracy> > > >> = {_M_impl = {<std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::metadata::PositionalAccuracy> > >> = {<__gnu_cxx::new_allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::metadata::PositionalAccuracy> > >> = {<No data fields>}, <No data fields>}, <std::_Vector_base<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::metadata::PositionalAccuracy> >, std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::metadata::PositionalAccuracy> > > >::_Vector_impl_data> = {_M_start = 0x1d7a040, _M_finish = 0x1d7a050, _M_end_of_storage = 0x1d7a050}, <No data fields>}}, <No data fields>}
        accuracy = 1
        op = {ptr = {<std::__shared_ptr<osgeo::proj::operation::ConcatenatedOperation, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<osgeo::proj::operation::ConcatenatedOperation, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x7fffffff99e0, _M_refcount = {_M_pi = 0x7fffffff99e0}}, <No data fields>}}
#2  0x00007fffef4ff585 in osgeo::proj::operation::CoordinateOperationFactory::Private::createOperationsDerivedTo(dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::crs::CRS> > const&, dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::crs::CRS> > const&, osgeo::proj::operation::CoordinateOperationFactory::Private::Context&, osgeo::proj::crs::DerivedCRS const*, std::vector<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> >, std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > > >&) (targetCRS=..., context=..., derivedSrc=0x51f7ca0, res=...) at iso19111/coordinateoperation.cpp:13346
        opSecond = @0x502b500: {ptr = {<std::__shared_ptr<osgeo::proj::operation::CoordinateOperation, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<osgeo::proj::operation::CoordinateOperation, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x46c7910, _M_refcount = {_M_pi = 0x2f8ed80}}, <No data fields>}}
        __for_range = @0x7fffffff9940: {<std::_Vector_base<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> >, std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > > >> = {_M_impl = {<std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > >> = {<__gnu_cxx::new_allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > >> = {<No data fields>}, <No data fields>}, <std::_Vector_base<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> >, std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > > >::_Vector_impl_data> = {_M_start = 0x502b500, _M_finish = 0x502b560, _M_end_of_storage = 0x502b560}, <No data fields>}}, <No data fields>}
        __for_begin = {_M_current = 0x502b500}
        __for_end = {_M_current = 0x502b560}
        opFirst = {ptr = {<std::__shared_ptr<osgeo::proj::operation::CoordinateOperation, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<osgeo::proj::operation::CoordinateOperation, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x1db05d8, _M_refcount = {_M_pi = 0x1db0590}}, <No data fields>}}
        opsSecond = {<std::_Vector_base<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> >, std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > > >> = {_M_impl = {<std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > >> = {<__gnu_cxx::new_allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > >> = {<No data fields>}, <No data fields>}, <std::_Vector_base<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> >, std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > > >::_Vector_impl_data> = {_M_start = 0x502b500, _M_finish = 0x502b560, _M_end_of_storage = 0x502b560}, <No data fields>}}, <No data fields>}
#3  0x00007fffef4fa900 in osgeo::proj::operation::CoordinateOperationFactory::Private::createOperations(dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::crs::CRS> > const&, dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::crs::CRS> > const&, osgeo::proj::operation::CoordinateOperationFactory::Private::Context&) (sourceCRS=..., targetCRS=..., context=...) at iso19111/coordinateoperation.cpp:12617
        res = {<std::_Vector_base<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> >, std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > > >> = {_M_impl = {<std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > >> = {<__gnu_cxx::new_allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > >> = {<No data fields>}, <No data fields>}, <std::_Vector_base<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> >, std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > > >::_Vector_impl_data> = {_M_start = 0x0, _M_finish = 0x0, _M_end_of_storage = 0x0}, <No data fields>}}, <No data fields>}
        boundSrc = 0x0
        boundDst = 0x0
        sourceProj4Ext = @0x51e0510: {static npos = 18446744073709551615, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x51e0520 ""}, _M_string_length = 0, {_M_local_buf = '\000' <repeats 15 times>, _M_allocated_capacity = 0}}
        targetProj4Ext = @0x1fffaa0: {static npos = 18446744073709551615, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x1fffab0 ""}, _M_string_length = 0, {_M_local_buf = '\000' <repeats 15 times>, _M_allocated_capacity = 0}}
        geodSrc = 0x0
        geodDst = 0x0
        geogSrc = 0x0
        geogDst = 0x0
        vertSrc = 0x0
        vertDst = 0x0
        derivedSrc = 0x51f7ca0
        derivedDst = 0x46551b0
        authFactory = @0x4feee00: {<std::__shared_ptr<osgeo::proj::io::AuthorityFactory, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<osgeo::proj::io::AuthorityFactory, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x1f4fad0, _M_refcount = {_M_pi = 0x5151730}}, <No data fields>}
        compoundSrc = 0x7fffffff9b60
        compoundDst = 0x4488158
#4  0x00007fffef508c36 in osgeo::proj::operation::CoordinateOperationFactory::createOperations(dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::crs::CRS> > const&, dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::crs::CRS> > const&, dropbox::oxygen::nn<std::unique_ptr<osgeo::proj::operation::CoordinateOperationContext, std::default_delete<osgeo::proj::operation::CoordinateOperationContext> > > const&) const (this=0x5177ed0, sourceCRS=..., targetCRS=..., context=...) at iso19111/coordinateoperation.cpp:14525
        srcBoundCRS = @0x4eb3250: {<std::__shared_ptr<osgeo::proj::crs::BoundCRS, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<osgeo::proj::crs::BoundCRS, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x0, _M_refcount = {_M_pi = 0x0}}, <No data fields>}
        targetBoundCRS = @0x44f4790: {<std::__shared_ptr<osgeo::proj::crs::BoundCRS, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<osgeo::proj::crs::BoundCRS, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x0, _M_refcount = {_M_pi = 0x0}}, <No data fields>}
        l_sourceCRS = {ptr = {<std::__shared_ptr<osgeo::proj::crs::CRS, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<osgeo::proj::crs::CRS, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x501a8d0, _M_refcount = {_M_pi = 0x501b120}}, <No data fields>}}
        l_targetCRS = {ptr = {<std::__shared_ptr<osgeo::proj::crs::CRS, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<osgeo::proj::crs::CRS, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x44ff740, _M_refcount = {_M_pi = 0x4500f80}}, <No data fields>}}
        sourceCRSExtent = {<std::__shared_ptr<osgeo::proj::metadata::Extent, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<osgeo::proj::metadata::Extent, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x5018990, _M_refcount = {_M_pi = 0x4fefb10}}, <No data fields>}
        l_resolvedSourceCRS = {ptr = {<std::__shared_ptr<osgeo::proj::crs::CRS, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<osgeo::proj::crs::CRS, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x51f7cc0, _M_refcount = {_M_pi = 0x502d290}}, <No data fields>}}
        targetCRSExtent = {<std::__shared_ptr<osgeo::proj::metadata::Extent, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<osgeo::proj::metadata::Extent, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x4503960, _M_refcount = {_M_pi = 0x44fc050}}, <No data fields>}
        l_resolvedTargetCRS = {ptr = {<std::__shared_ptr<osgeo::proj::crs::CRS, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<osgeo::proj::crs::CRS, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x46551d0, _M_refcount = {_M_pi = 0x1bbc2b0}}, <No data fields>}}
        contextPrivate = {extent1 = @0x7fffffff9c80, extent2 = @0x7fffffff9c60, context = @0x45ac150, inCreateOperationsWithDatumPivotAntiRecursion = false, inCreateOperationsGeogToVertWithAlternativeGeog = false, inCreateOperationsGeogToVertWithIntermediateVert = false, skipHorizontalTransformation = false, cacheNameToCRS = {_M_t = {_M_impl = {<std::allocator<std::_Rb_tree_node<std::pair<std::pair<osgeo::proj::io::AuthorityFactory::ObjectType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const, std::__cxx11::list<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > > >> = {<__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<std::pair<osgeo::proj::io::AuthorityFactory::ObjectType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const, std::__cxx11::list<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > > >> = {<No data fields>}, <No data fields>}, <std::_Rb_tree_key_compare<std::less<std::pair<osgeo::proj::io::AuthorityFactory::ObjectType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >> = {_M_key_compare = {<std::binary_function<std::pair<osgeo::proj::io::AuthorityFactory::ObjectType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::pair<osgeo::proj::io::AuthorityFactory::ObjectType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, bool>> = {<No data fields>}, <No data fields>}}, <std::_Rb_tree_header> = {_M_header = {_M_color = std::_S_red, _M_parent = 0x0, _M_left = 0x7fffffff9c28, _M_right = 0x7fffffff9c28}, _M_node_count = 0}, <No data fields>}}}}
#5  0x00007fffef61ec6c in internal_proj_create_operations(PJ_CONTEXT*, PJ const*, PJ const*, PJ_OPERATION_FACTORY_CONTEXT const*) (ctx=0xdd1050, source_crs=0x5399ea0, target_crs=0x4154db0, operationContext=0x45ac150) at iso19111/c_api.cpp:7308
        factory = {ptr = {_M_t = {_M_t = {<std::_Tuple_impl<0, osgeo::proj::operation::CoordinateOperationFactory*, std::default_delete<osgeo::proj::operation::CoordinateOperationFactory> >> = {<std::_Tuple_impl<1, std::default_delete<osgeo::proj::operation::CoordinateOperationFactory> >> = {<std::_Head_base<1, std::default_delete<osgeo::proj::operation::CoordinateOperationFactory>, true>> = {<std::default_delete<osgeo::proj::operation::CoordinateOperationFactory>> = {<No data fields>}, <No data fields>}, <No data fields>}, <std::_Head_base<0, osgeo::proj::operation::CoordinateOperationFactory*, false>> = {_M_head_impl = 0x5177ed0}, <No data fields>}, <No data fields>}}}}
        objects = {<std::_Vector_base<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::common::IdentifiedObject> >, std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::common::IdentifiedObject> > > >> = {_M_impl = {<std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::common::IdentifiedObject> > >> = {<__gnu_cxx::new_allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::common::IdentifiedObject> > >> = {<No data fields>}, <No data fields>}, <std::_Vector_base<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::common::IdentifiedObject> >, std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::common::IdentifiedObject> > > >::_Vector_impl_data> = {_M_start = 0x0, _M_finish = 0x0, _M_end_of_storage = 0x0}, <No data fields>}}, <No data fields>}
        ops = {<std::_Vector_base<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> >, std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > > >> = {_M_impl = {<std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > >> = {<__gnu_cxx::new_allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > >> = {<No data fields>}, <No data fields>}, <std::_Vector_base<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> >, std::allocator<dropbox::oxygen::nn<std::shared_ptr<osgeo::proj::operation::CoordinateOperation> > > >::_Vector_impl_data> = {_M_start = 0x7f0047535045, _M_finish = 0x53aa128, _M_end_of_storage = 0x7fffffff9d90}, <No data fields>}}, <No data fields>}
        __PRETTY_FUNCTION__ = "PJ_OBJ_LIST* internal_proj_create_operations(PJ_CONTEXT*, const PJ*, const PJ*, const PJ_OPERATION_FACTORY_CONTEXT*)"
        sourceCRS = {<std::__shared_ptr<osgeo::proj::crs::CRS, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<osgeo::proj::crs::CRS, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x501a8d0, _M_refcount = {_M_pi = 0x501b120}}, <No data fields>}
        __FUNCTION__ = "internal_proj_create_operations"
        targetCRS = {<std::__shared_ptr<osgeo::proj::crs::CRS, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<osgeo::proj::crs::CRS, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x44ff740, _M_refcount = {_M_pi = 0x4500f80}}, <No data fields>}
#6  0x00007ffff3b64c75 in QgsDatumTransform::operations(QgsCoordinateReferenceSystem const&, QgsCoordinateReferenceSystem const&, bool) (source=..., destination=..., includeSuperseded=false) at /home/nyall/dev/qgis-proj6/src/core/qgsdatumtransform.cpp:70
        ops = 0x0
        res = {<QListSpecialMethods<QgsDatumTransform::TransformDetails>> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = {<std::__atomic_base<int>> = {static _S_alignment = 4, _M_i = -1}, <No data fields>}}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x7fffec8aaaa0 <QListData::shared_null>}, d = 0x7fffec8aaaa0 <QListData::shared_null>}}
        c = 0xdd1050
        operationContext = 0x45ac150
        src = 0x4ef59c0
        dest = 0x50ed9c0
        pjContext = 0xdd1050
#7  0x00007ffff6a135cd in QgsDatumTransformDialog::QgsDatumTransformDialog(QgsCoordinateReferenceSystem const&, QgsCoordinateReferenceSystem const&, bool, bool, bool, QPair<int, int>, QWidget*, QFlags<Qt::WindowType>, QString const&, QgsMapCanvas*) (this=0x7fffffffa250, sCrs=..., dCrs=..., allowCrsChanges=false, showMakeDefault=true, forceChoice=true, selectedDatumTransforms=..., parent=0x171dec0, f=..., selectedProj=..., mapCanvas=0x19f1510) at /home/nyall/dev/qgis-proj6/src/gui/qgsdatumtransformdialog.cpp:202
        sourceCrs = {static staticMetaObject = {d = {superdata = 0x0, stringdata = 0x7ffff4292320 <qt_meta_stringdata_QgsCoordinateReferenceSystem>, data = 0x7ffff4292440 <qt_meta_data_QgsCoordinateReferenceSystem>, static_metacall = 0x7ffff35df620 <QgsCoordinateReferenceSystem::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x7ffff485bb70 <qt_meta_extradata_QgsCoordinateReferenceSystem>, extradata = 0x0}}, d = {d = 0x53aa0e0}, static sCustomSrsValidation = 0x7ffff738e5f2 <customSrsValidation_(QgsCoordinateReferenceSystem&)>, static sDisableSrIdCache = false, static sDisableOgcCache = false, static sDisableProj4Cache = false, static sDisableWktCache = false, static sDisableSrsIdCache = false, static sDisableStringCache = false}
        destinationCrs = {static staticMetaObject = {d = {superdata = 0x0, stringdata = 0x7ffff4292320 <qt_meta_stringdata_QgsCoordinateReferenceSystem>, data = 0x7ffff4292440 <qt_meta_data_QgsCoordinateReferenceSystem>, static_metacall = 0x7ffff35df620 <QgsCoordinateReferenceSystem::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x7ffff485bb70 <qt_meta_extradata_QgsCoordinateReferenceSystem>, extradata = 0x0}}, d = {d = 0x44e7de0}, static sCustomSrsValidation = 0x7ffff738e5f2 <customSrsValidation_(QgsCoordinateReferenceSystem&)>, static sDisableSrIdCache = false, static sDisableOgcCache = false, static sDisableProj4Cache = false, static sDisableWktCache = false, static sDisableSrsIdCache = false, static sDisableStringCache = false}
        headers = {<QList<QString>> = {<QListSpecialMethods<QString>> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = {<std::__atomic_base<int>> = {static _S_alignment = 4, _M_i = -1}, <No data fields>}}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x5028e20}, d = 0x5028e20}}, <No data fields>}
#8  0x00007ffff6a12631 in QgsDatumTransformDialog::run(QgsCoordinateReferenceSystem const&, QgsCoordinateReferenceSystem const&, QWidget*, QgsMapCanvas*, QString const&) (sourceCrs=..., destinationCrs=..., parent=0x171dec0, mapCanvas=0x19f1510, windowTitle=...) at /home/nyall/dev/qgis-proj6/src/gui/qgsdatumtransformdialog.cpp:47
        context = {d = {d = 0x1dac5c0}}
        dlg = {<QDialog> = {<No data fields>}, <Ui::QgsDatumTransformDialogBase> = {<Ui_QgsDatumTransformDialogBase> = {gridLayout = 0x21c6fd0, horizontalLayout = 0x54ecdf0, mHideDeprecatedCheckBox = 0x4925e40, mShowSupersededCheckBox = 0x39df060, horizontalSpacer = 0x2178840, mMakeDefaultCheckBox = 0x517e340, mDatumTransformTableWidget = 0x1b3f540, mButtonBox = 0x2085120, horizontalLayout_2 = 0x21afeb0, mLabelSrcDescription = 0x1f247d0, mLabelDstDescription = 0x50dfd90, mAreaCanvas = 0x16ea420, mCrsStackedWidget = 0x509c2f0, page = 0x4438940, verticalLayout = 0x3683de0, gridLayout_4 = 0x509e370, label = 0xd50de0, mSourceProjectionSelectionWidget = 0x50e1ad0, label_2 = 0x514c380, mDestinationProjectionSelectionWidget = 0x509e4e0, page_2 = 0x5014170, verticalLayout_2 = 0x21e5640, gridLayout_5 = 0x51c7710, label_3 = 0x525a200, label_4 = 0x498f9c0, mDestCrsLabel = 0x50a3240, mSourceCrsLabel = 0x1f421f0, textEdit = 0x214c7e0}, <No data fields>}, static staticMetaObject = {d = {superdata = 0x7ffff00992c0 <QDialog::staticMetaObject>, stringdata = 0x7ffff6ceac20 <qt_meta_stringdata_QgsDatumTransformDialog>, data = 0x7ffff6ceade0 <qt_meta_data_QgsDatumTransformDialog>, static_metacall = 0x7ffff65498a0 <QgsDatumTransformDialog::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, extradata = 0x0}}, mDatumTransforms = {<QListSpecialMethods<QgsDatumTransform::TransformDetails>> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = {<std::__atomic_base<int>> = {static _S_alignment = 4, _M_i = -1}, <No data fields>}}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x7fffec8aaaa0 <QListData::shared_null>}, d = 0x7fffec8aaaa0 <QListData::shared_null>}}, mSourceCrs = {static staticMetaObject = {d = {superdata = 0x0, stringdata = 0x7ffff4292320 <qt_meta_stringdata_QgsCoordinateReferenceSystem>, data = 0x7ffff4292440 <qt_meta_data_QgsCoordinateReferenceSystem>, static_metacall = 0x7ffff35df620 <QgsCoordinateReferenceSystem::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x7ffff485bb70 <qt_meta_extradata_QgsCoordinateReferenceSystem>, extradata = 0x0}}, d = {d = 0x53aa0e0}, static sCustomSrsValidation = 0x7ffff738e5f2 <customSrsValidation_(QgsCoordinateReferenceSystem&)>, static sDisableSrIdCache = false, static sDisableOgcCache = false, static sDisableProj4Cache = false, static sDisableWktCache = false, static sDisableSrsIdCache = false, static sDisableStringCache = false}, mDestinationCrs = {static staticMetaObject = {d = {superdata = 0x0, stringdata = 0x7ffff4292320 <qt_meta_stringdata_QgsCoordinateReferenceSystem>, data = 0x7ffff4292440 <qt_meta_data_QgsCoordinateReferenceSystem>, static_metacall = 0x7ffff35df620 <QgsCoordinateReferenceSystem::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x7ffff485bb70 <qt_meta_extradata_QgsCoordinateReferenceSystem>, extradata = 0x0}}, d = {d = 0x44e7de0}, static sCustomSrsValidation = 0x7ffff738e5f2 <customSrsValidation_(QgsCoordinateReferenceSystem&)>, static sDisableSrIdCache = false, static sDisableOgcCache = false, static sDisableProj4Cache = false, static sDisableWktCache = false, static sDisableSrsIdCache = false, static sDisableStringCache = false}, mPreviousCursorOverride = {_M_t = {_M_t = {<std::_Tuple_impl<0, QgsTemporaryCursorRestoreOverride*, std::default_delete<QgsTemporaryCursorRestoreOverride> >> = {<std::_Tuple_impl<1, std::default_delete<QgsTemporaryCursorRestoreOverride> >> = {<std::_Head_base<1, std::default_delete<QgsTemporaryCursorRestoreOverride>, true>> = {<std::default_delete<QgsTemporaryCursorRestoreOverride>> = {<No data fields>}, <No data fields>}, <No data fields>}, <std::_Head_base<0, QgsTemporaryCursorRestoreOverride*, false>> = {_M_head_impl = 0x226c750}, <No data fields>}, <No data fields>}}}}
#9  0x00007ffff740cd37 in QgisApp::askUserForDatumTransform(QgsCoordinateReferenceSystem const&, QgsCoordinateReferenceSystem const&, QgsMapLayer const*) (this=0x171dec0, sourceCrs=..., destinationCrs=..., layer=0x4a2e870) at /home/nyall/dev/qgis-proj6/src/app/qgisapp.cpp:14223
        title = {static null = {<No data fields>}, d = 0x47551e0}
#10 0x00007ffff73f24b9 in QgisApp::projectCrsChanged() (this=0x171dec0) at /home/nyall/dev/qgis-proj6/src/app/qgisapp.cpp:10311
        it = {i = 0x51f8fa0}
        __FUNCTION__ = "projectCrsChanged"
        alreadyAsked = {<QListSpecialMethods<QgsCoordinateReferenceSystem>> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = {<std::__atomic_base<int>> = {static _S_alignment = 4, _M_i = -1}, <No data fields>}}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x20ad750}, d = 0x20ad750}}
        layers = {d = 0x531cb00}
#11 0x00007ffff748688f in QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (QgisApp::*)()>::call(void (QgisApp::*)(), QgisApp*, void**) (f=(void (QgisApp::*)(QgisApp * const)) 0x7ffff73f2208 <QgisApp::projectCrsChanged()>, o=0x171dec0, arg=0x7fffffffa750) at /usr/include/qt5/QtCore/qobjectdefs_impl.h:152
#12 0x00007ffff7481499 in QtPrivate::FunctionPointer<void (QgisApp::*)()>::call<QtPrivate::List<>, void>(void (QgisApp::*)(), QgisApp*, void**) (f=(void (QgisApp::*)(QgisApp * const)) 0x7ffff73f2208 <QgisApp::projectCrsChanged()>, o=0x171dec0, arg=0x7fffffffa750) at /usr/include/qt5/QtCore/qobjectdefs_impl.h:185
#13 0x00007ffff74766fc in QtPrivate::QSlotObject<void (QgisApp::*)(), QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) (which=1, this_=0x21fa7e0, r=0x171dec0, a=0x7fffffffa750, ret=0x0) at /usr/include/qt5/QtCore/qobjectdefs_impl.h:414
#14 0x00007fffec7fff40 in QMetaObject::activate(QObject*, int, int, void**) () at /lib64/libQt5Core.so.5
#15 0x00007ffff35ef775 in QgsProject::crsChanged() (this=0xc11690) at src/core/qgis_core_autogen/EWIEGA46WW/moc_qgsproject.cpp:1006
#16 0x00007ffff3d47f77 in QgsProject::readProjectFile(QString const&, QFlags<QgsProject::ReadFlag>) (this=0xc11690, filename=..., flags=...) at /home/nyall/dev/qgis-proj6/src/core/qgsproject.cpp:1502
        projectFile = <incomplete type>
        settings = {<QObject> = {<No data fields>}, static staticMetaObject = {d = {superdata = 0x7fffeca7efe0 <QObject::staticMetaObject>, stringdata = 0x7ffff429db80 <qt_meta_stringdata_QgsSettings>, data = 0x7ffff429dbc0 <qt_meta_data_QgsSettings>, static_metacall = 0x7ffff35f0804 <QgsSettings::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, extradata = 0x0}}, mUserSettings = 0x1f26ec0, mGlobalSettings = 0x51286e0, mUsingGlobalArray = false}
        localeFileName = {static null = {<No data fields>}, d = 0x1f518b0}
        doc = {_M_t = {_M_t = {<std::_Tuple_impl<0, QDomDocument*, std::default_delete<QDomDocument> >> = {<std::_Tuple_impl<1, std::default_delete<QDomDocument> >> = {<std::_Head_base<1, std::default_delete<QDomDocument>, true>> = {<std::default_delete<QDomDocument>> = {<No data fields>}, <No data fields>}, <No data fields>}, <std::_Head_base<0, QDomDocument*, false>> = {_M_head_impl = 0x5026a40}, <No data fields>}, <No data fields>}}}
        line = 1000
        column = 33188
        errorMsg = {static null = {<No data fields>}, d = 0x7fffec8a8b60 <QArrayData::shared_null>}
        __FUNCTION__ = "readProjectFile"
        fileVersion = {mMajor = 3, mMinor = 9, mSub = 0, mName = {static null = {<No data fields>}, d = 0x209ff30}}
        thisVersion = {mMajor = 3, mMinor = 11, mSub = 0, mName = {static null = {<No data fields>}, d = 0x52dbcb0}}
        fileName = {static null = {<No data fields>}, d = 0x1395770}
        aStorage = {_M_t = {_M_t = {<std::_Tuple_impl<0, QgsAuxiliaryStorage*, std::default_delete<QgsAuxiliaryStorage> >> = {<std::_Tuple_impl<1, std::default_delete<QgsAuxiliaryStorage> >> = {<std::_Head_base<1, std::default_delete<QgsAuxiliaryStorage>, true>> = {<std::default_delete<QgsAuxiliaryStorage>> = {<No data fields>}, <No data fields>}, <No data fields>}, <std::_Head_base<0, QgsAuxiliaryStorage*, false>> = {_M_head_impl = 0x0}, <No data fields>}, <No data fields>}}}
        oldTitle = {static null = {<No data fields>}, d = 0x7fffec8a8b60 <QArrayData::shared_null>}
        homePathNl = {impl = 0x4a2e4d0}
        backgroundColor = {cspec = QColor::Rgb, ct = {argb = {alpha = 65535, red = 65535, green = 65535, blue = 65535, pad = 0}, ahsv = {alpha = 65535, hue = 65535, saturation = 65535, value = 65535, pad = 0}, acmyk = {alpha = 65535, cyan = 65535, magenta = 65535, yellow = 65535, black = 0}, ahsl = {alpha = 65535, hue = 65535, saturation = 65535, lightness = 65535, pad = 0}, array = {65535, 65535, 65535, 65535, 0}}}
        selectionColor = {cspec = QColor::Rgb, ct = {argb = {alpha = 65535, red = 65535, green = 65535, blue = 0, pad = 0}, ahsv = {alpha = 65535, hue = 65535, saturation = 65535, value = 0, pad = 0}, acmyk = {alpha = 65535, cyan = 65535, magenta = 65535, yellow = 0, black = 0}, ahsl = {alpha = 65535, hue = 65535, saturation = 65535, lightness = 0, pad = 0}, array = {65535, 65535, 65535, 0, 0}}}
        context = {mPathResolver = {mBaseFileName = {static null = {<No data fields>}, d = 0x1395770}}, mMessages = {<QListSpecialMethods<QgsReadWriteContext::ReadWriteMessage>> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = {<std::__atomic_base<int>> = {static _S_alignment = 4, _M_i = -1}, <No data fields>}}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x7fffec8aaaa0 <QListData::shared_null>}, d = 0x7fffec8aaaa0 <QListData::shared_null>}}, mCategories = {<QList<QString>> = {<QListSpecialMethods<QString>> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = {<std::__atomic_base<int>> = {static _S_alignment = 4, _M_i = -1}, <No data fields>}}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x7fffec8aaaa0 <QListData::shared_null>}, d = 0x7fffec8aaaa0 <QListData::shared_null>}}, <No data fields>}, mProjectTranslator = 0xc116b0, mCoordinateTransformContext = {d = {d = 0x166ac60}}}
        projectCrs = {static staticMetaObject = {d = {superdata = 0x0, stringdata = 0x7ffff4292320 <qt_meta_stringdata_QgsCoordinateReferenceSystem>, data = 0x7ffff4292440 <qt_meta_data_QgsCoordinateReferenceSystem>, static_metacall = 0x7ffff35df620 <QgsCoordinateReferenceSystem::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x7ffff485bb70 <qt_meta_extradata_QgsCoordinateReferenceSystem>, extradata = 0x0}}, d = {d = 0x44e7de0}, static sCustomSrsValidation = 0x7ffff738e5f2 <customSrsValidation_(QgsCoordinateReferenceSystem&)>, static sDisableSrIdCache = false, static sDisableOgcCache = false, static sDisableProj4Cache = false, static sDisableWktCache = false, static sDisableSrsIdCache = false, static sDisableStringCache = false}
        datumErrors = {<QList<QString>> = {<QListSpecialMethods<QString>> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = {<std::__atomic_base<int>> = {static _S_alignment = 4, _M_i = -1}, <No data fields>}}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x7fffec8aaaa0 <QListData::shared_null>}, d = 0x7fffec8aaaa0 <QListData::shared_null>}}, <No data fields>}
        variableNames = {<QList<QString>> = {<QListSpecialMethods<QString>> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = {<std::__atomic_base<int>> = {static _S_alignment = 4, _M_i = -1}, <No data fields>}}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x7fffec8aaaa0 <QListData::shared_null>}, d = 0x7fffec8aaaa0 <QListData::shared_null>}}, <No data fields>}
        variableValues = {<QList<QString>> = {<QListSpecialMethods<QString>> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = {<std::__atomic_base<int>> = {static _S_alignment = 4, _M_i = -1}, <No data fields>}}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x7fffec8aaaa0 <QListData::shared_null>}, d = 0x7fffec8aaaa0 <QListData::shared_null>}}, <No data fields>}
        nl = {impl = 0xd66c10}
        layerTreeElem = {<QDomNode> = {impl = 0x4714590}, <No data fields>}
        brokenNodes = {<QListSpecialMethods<QDomNode>> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = {<std::__atomic_base<int>> = {static _S_alignment = 4, _M_i = -1}, <No data fields>}}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x7fffec8aaaa0 <QListData::shared_null>}, d = 0x7fffec8aaaa0 <QListData::shared_null>}}
        clean = true
        layers = {d = 0x54492d0}
        layerTreeCanvasElem = {<QDomNode> = {impl = 0x0}, <No data fields>}
        existingMaps = {d = 0x4742b70}
        scales = {<QList<QString>> = {<QListSpecialMethods<QString>> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = {<std::__atomic_base<int>> = {static _S_alignment = 4, _M_i = -1}, <No data fields>}}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x7fffec8aaaa0 <QListData::shared_null>}, d = 0x7fffec8aaaa0 <QListData::shared_null>}}, <No data fields>}
        res = {d = 0x7fffec8a8b60 <QArrayData::shared_null>}
        viewSettingsElement = {<QDomNode> = {impl = 0x0}, <No data fields>}
#17 0x00007ffff3d55bf3 in QgsProject::unzip(QString const&, QFlags<QgsProject::ReadFlag>) (this=0xc11690, filename=..., flags=...) at /home/nyall/dev/qgis-proj6/src/core/qgsproject.cpp:2959
        archive = {_M_t = {_M_t = {<std::_Tuple_impl<0, QgsProjectArchive*, std::default_delete<QgsProjectArchive> >> = {<std::_Tuple_impl<1, std::default_delete<QgsProjectArchive> >> = {<std::_Head_base<1, std::default_delete<QgsProjectArchive>, true>> = {<std::default_delete<QgsProjectArchive>> = {<No data fields>}, <No data fields>}, <No data fields>}, <std::_Head_base<0, QgsProjectArchive*, false>> = {_M_head_impl = 0xa69550}, <No data fields>}, <No data fields>}}}
#18 0x00007ffff3d43e7e in QgsProject::read(QFlags<QgsProject::ReadFlag>) (this=0xc11690, flags=...) at /home/nyall/dev/qgis-proj6/src/core/qgsproject.cpp:1115
        storage = 0x0
        filename = {static null = {<No data fields>}, d = 0x1395770}
        returnValue = false
#19 0x00007ffff3d43a1f in QgsProject::read(QString const&, QFlags<QgsProject::ReadFlag>) (this=0xc11690, filename=..., flags=...) at /home/nyall/dev/qgis-proj6/src/core/qgsproject.cpp:1081
#20 0x00007ffff73d5599 in QgisApp::addProject(QString const&) (this=0x171dec0, projectFile=...) at /home/nyall/dev/qgis-proj6/src/app/qgisapp.cpp:6376
        refreshBlocker = {mReleased = false}
        returnCode = false
        dirtyBlocker = {_M_t = {_M_t = {<std::_Tuple_impl<0, QgsProjectDirtyBlocker*, std::default_delete<QgsProjectDirtyBlocker> >> = {<std::_Tuple_impl<1, std::default_delete<QgsProjectDirtyBlocker> >> = {<std::_Head_base<1, std::default_delete<QgsProjectDirtyBlocker>, true>> = {<std::default_delete<QgsProjectDirtyBlocker>> = {<No data fields>}, <No data fields>}, <No data fields>}, <std::_Head_base<0, QgsProjectDirtyBlocker*, false>> = {_M_head_impl = 0x51697d0}, <No data fields>}, <No data fields>}}}
        connectionScope = <incomplete type>
        badLayersHandled = false
        pfi = {d_ptr = {d = 0x4a7b480}}
        autoSetupOnFirstLayer = true
        __FUNCTION__ = "addProject"
#21 0x00007ffff73d9723 in QgisApp::openProject(QString const&) (this=0x171dec0, fileName=...) at /home/nyall/dev/qgis-proj6/src/app/qgisapp.cpp:6823
        refreshBlocker = {mReleased = false}
#22 0x00007ffff764de5a in QgsWelcomePage::recentProjectItemActivated(QModelIndex const&) (this=0x235cc10, index=...) at /home/nyall/dev/qgis-proj6/src/app/qgswelcomepage.cpp:211
#23 0x00007ffff7652a85 in QtPrivate::FunctorCall<QtPrivate::IndexesList<0>, QtPrivate::List<QModelIndex const&>, void, void (QgsWelcomePage::*)(QModelIndex const&)>::call(void (QgsWelcomePage::*)(QModelIndex const&), QgsWelcomePage*, void**) (f=(void (QgsWelcomePage::*)(QgsWelcomePage * const, const QModelIndex &)) 0x7ffff764ddf0 <QgsWelcomePage::recentProjectItemActivated(QModelIndex const&)>, o=0x235cc10, arg=0x7fffffffb880) at /usr/include/qt5/QtCore/qobjectdefs_impl.h:152
#24 0x00007ffff7652931 in QtPrivate::FunctionPointer<void (QgsWelcomePage::*)(QModelIndex const&)>::call<QtPrivate::List<QModelIndex const&>, void>(void (QgsWelcomePage::*)(QModelIndex const&), QgsWelcomePage*, void**) (f=(void (QgsWelcomePage::*)(QgsWelcomePage * const, const QModelIndex &)) 0x7ffff764ddf0 <QgsWelcomePage::recentProjectItemActivated(QModelIndex const&)>, o=0x235cc10, arg=0x7fffffffb880) at /usr/include/qt5/QtCore/qobjectdefs_impl.h:185
#25 0x00007ffff7652770 in QtPrivate::QSlotObject<void (QgsWelcomePage::*)(QModelIndex const&), QtPrivate::List<QModelIndex const&>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) (which=1, this_=0xcf2e00, r=0x235cc10, a=0x7fffffffb880, ret=0x0) at /usr/include/qt5/QtCore/qobjectdefs_impl.h:414
#26 0x00007fffec7fff40 in QMetaObject::activate(QObject*, int, int, void**) () at /lib64/libQt5Core.so.5
#27 0x00007fffefde90a9 in QAbstractItemView::activated(QModelIndex const&) () at /lib64/libQt5Widgets.so.5
#28 0x00007fffefdf781f in QAbstractItemView::mouseDoubleClickEvent(QMouseEvent*) () at /lib64/libQt5Widgets.so.5
#29 0x00007fffefbc53ee in QWidget::event(QEvent*) () at /lib64/libQt5Widgets.so.5
#30 0x00007fffefc72942 in QFrame::event(QEvent*) () at /lib64/libQt5Widgets.so.5
#31 0x00007fffefdf7202 in QAbstractItemView::viewportEvent(QEvent*) () at /lib64/libQt5Widgets.so.5
#32 0x00007fffec7d5c2e in QCoreApplicationPrivate::sendThroughObjectEventFilters(QObject*, QEvent*) () at /lib64/libQt5Core.so.5
#33 0x00007fffefb82ac5 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /lib64/libQt5Widgets.so.5
#34 0x00007fffefb8c3a3 in QApplication::notify(QObject*, QEvent*) () at /lib64/libQt5Widgets.so.5
#35 0x00007ffff3a7fb4d in QgsApplication::notify(QObject*, QEvent*) (this=0x7fffffffcaf0, receiver=0x2131f90, event=0x7fffffffc0f0) at /home/nyall/dev/qgis-proj6/src/core/qgsapplication.cpp:416
        done = true
        __FUNCTION__ = "notify"
#36 0x00007fffec7d5de8 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /lib64/libQt5Core.so.5
#37 0x00007fffefb8b4b7 in QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool, bool) () at /lib64/libQt5Widgets.so.5
#38 0x00007fffefbe10dd in QWidgetWindow::handleMouseEvent(QMouseEvent*) () at /lib64/libQt5Widgets.so.5
#39 0x00007fffefbe3f6c in QWidgetWindow::event(QEvent*) () at /lib64/libQt5Widgets.so.5
#40 0x00007fffefb82ad6 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /lib64/libQt5Widgets.so.5
#41 0x00007fffefb8c150 in QApplication::notify(QObject*, QEvent*) () at /lib64/libQt5Widgets.so.5
#42 0x00007ffff3a7fb4d in QgsApplication::notify(QObject*, QEvent*) (this=0x7fffffffcaf0, receiver=0x1a15590, event=0x7fffffffc6a0) at /home/nyall/dev/qgis-proj6/src/core/qgsapplication.cpp:416
        done = true
        __FUNCTION__ = "notify"
#43 0x00007fffec7d5de8 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /lib64/libQt5Core.so.5
#44 0x00007fffecdb466c in QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent*) () at /lib64/libQt5Gui.so.5
#45 0x00007fffecdb5f4b in QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent*) () at /lib64/libQt5Gui.so.5
#46 0x00007fffecd9254b in QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt5Gui.so.5
#47 0x00007fffdaa6eb5e in xcbSourceDispatch(_GSource*, int (*)(void*), void*) () at /lib64/libQt5XcbQpa.so.5
#48 0x00007fffeaf5d4a0 in g_main_context_dispatch () at /lib64/libglib-2.0.so.0
#49 0x00007fffeaf5d830 in g_main_context_iterate.isra () at /lib64/libglib-2.0.so.0
#50 0x00007fffeaf5d8d3 in g_main_context_iteration () at /lib64/libglib-2.0.so.0
#51 0x00007fffec82acb5 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt5Core.so.5
#52 0x00007fffec7d4ceb in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt5Core.so.5
#53 0x00007fffec7dca16 in QCoreApplication::exec() () at /lib64/libQt5Core.so.5
#54 0x0000000000417726 in main(int, char**) (argc=1, argv=0x7fffffffe4d8) at /home/nyall/dev/qgis-proj6/src/app/main.cpp:1598
        retval = 16
        profile = 0x9f1970
        desiredStyle = {static null = {<No data fields>}, d = 0x15571b0}
        w = 600
        mySplashPath = {static null = {<No data fields>}, d = 0x7ffff43559a0 <QgsApplication::splashPath()::{lambda()#1}::operator()() const::qstring_literal>}
        h = 300
        mypSplash = 0x1540300
        qgis = 0x171dec0
        sigwatch = {<QObject> = {<No data fields>}, static staticMetaObject = {d = {superdata = 0x7fffeca7efe0 <QObject::staticMetaObject>, stringdata = 0x87f940 <qt_meta_stringdata_UnixSignalWatcher>, data = 0x87fa00 <qt_meta_data_UnixSignalWatcher>, static_metacall = 0x41e61a <UnixSignalWatcher::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, extradata = 0x0}}, d_ptr = 0x7fffd4006db0}
        manager = {<QObject> = {<No data fields>}, static staticMetaObject = {d = {superdata = 0x7fffeca7efe0 <QObject::staticMetaObject>, stringdata = 0x7ffff42a1060 <qt_meta_stringdata_QgsUserProfileManager>, data = 0x7ffff42a10e0 <qt_meta_data_QgsUserProfileManager>, static_metacall = 0x7ffff35f3bde <QgsUserProfileManager::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, extradata = 0x0}}, mWatchProfiles = false, mWatcher = {_M_t = {_M_t = {<std::_Tuple_impl<0, QFileSystemWatcher*, std::default_delete<QFileSystemWatcher> >> = {<std::_Tuple_impl<1, std::default_delete<QFileSystemWatcher> >> = {<std::_Head_base<1, std::default_delete<QFileSystemWatcher>, true>> = {<std::default_delete<QFileSystemWatcher>> = {<No data fields>}, <No data fields>}, <No data fields>}, <std::_Head_base<0, QFileSystemWatcher*, false>> = {_M_head_impl = 0x0}, <No data fields>}, <No data fields>}}}, mRootProfilePath = {static null = {<No data fields>}, d = 0x9ee5f0}, mUserProfile = {_M_t = {_M_t = {<std::_Tuple_impl<0, QgsUserProfile*, std::default_delete<QgsUserProfile> >> = {<std::_Tuple_impl<1, std::default_delete<QgsUserProfile> >> = {<std::_Head_base<1, std::default_delete<QgsUserProfile>, true>> = {<std::default_delete<QgsUserProfile>> = {<No data fields>}, <No data fields>}, <No data fields>}, <std::_Head_base<0, QgsUserProfile*, false>> = {_M_head_impl = 0x0}, <No data fields>}, <No data fields>}}}, mSettings = {_M_t = {_M_t = {<std::_Tuple_impl<0, QSettings*, std::default_delete<QSettings> >> = {<std::_Tuple_impl<1, std::default_delete<QSettings> >> = {<std::_Head_base<1, std::default_delete<QSettings>, true>> = {<std::default_delete<QSettings>> = {<No data fields>}, <No data fields>}, <No data fields>}, <std::_Head_base<0, QSettings*, false>> = {_M_head_impl = 0x9f18c0}, <No data fields>}, <No data fields>}}}}
        profileFolder = {static null = {<No data fields>}, d = 0x9f61c0}
        settings = {<QObject> = {<No data fields>}, static staticMetaObject = {d = {superdata = 0x7fffeca7efe0 <QObject::staticMetaObject>, stringdata = 0x7ffff429db80 <qt_meta_stringdata_QgsSettings>, data = 0x7ffff429dbc0 <qt_meta_data_QgsSettings>, static_metacall = 0x7ffff35f0804 <QgsSettings::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, extradata = 0x0}}, mUserSettings = 0xc0f160, mGlobalSettings = 0xd167e0, mUsingGlobalArray = false}
        relLibPath = {static null = {<No data fields>}, d = 0x14c23a0}
        systemEnvVars = {d = 0xcb8670}
        theme = {static null = {<No data fields>}, d = 0x14856e0}
        activeStyleName = {static null = {<No data fields>}, d = 0x15571e0}
        myApp = {<QApplication> = {<No data fields>}, static staticMetaObject = {d = {superdata = 0x7ffff0084020 <QApplication::staticMetaObject>, stringdata = 0x7ffff4290e40 <qt_meta_stringdata_QgsApplication>, data = 0x7ffff4291040 <qt_meta_data_QgsApplication>, static_metacall = 0x7ffff35dd7d2 <QgsApplication::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, extradata = 0x0}}, static QGIS_ORGANIZATION_NAME = 0x7ffff4354873 "QGIS", static QGIS_ORGANIZATION_DOMAIN = 0x7ffff4354878 "qgis.org", static QGIS_APPLICATION_NAME = 0x7ffff4354881 "QGIS3", static mFileOpenEventReceiver31100 = 0x171dec0, static mInitialized31100 = true, static mRunningFromBuildDir31100 = true, static sMaxThreads31100 = -1, mIconCache = {d = 0xc28d10}, mCursorCache = {d = 0x200aea0}, mQgisTranslator = 0xbaf3e0, mQtTranslator = 0xb9ebe0, mDataItemProviderRegistry = 0x1b425e0, mAuthManager = 0x1b3f0a0, mApplicationMembers = 0xc430b0, static sApplicationMembers = 0x0, static sAuthManager = 0x0}
        libPaths = {<QList<QString>> = {<QListSpecialMethods<QString>> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = {<std::__atomic_base<int>> = {static _S_alignment = 4, _M_i = -1}, <No data fields>}}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x14f9f20}, d = 0x14f9f20}}, <No data fields>}
        customizationsettings = 0x1485b70
        useCustomVars = false
        myPixmap = <incomplete type>
        preApplicationLogMessages = {<QList<QString>> = {<QListSpecialMethods<QString>> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = {<std::__atomic_base<int>> = {static _S_alignment = 4, _M_i = -1}, <No data fields>}}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x9f3f10}, d = 0x9f3f10}}, <No data fields>}
        __FUNCTION__ = "main"
        mySnapshotFileName = {static null = {<No data fields>}, d = 0x7fffec8a8b60 <QArrayData::shared_null>}
        configLocalStorageLocation = {static null = {<No data fields>}, d = 0x9f5730}
        profileName = {static null = {<No data fields>}, d = 0x9f5fb0}
        mySnapshotWidth = 800
        mySnapshotHeight = 600
        myHideSplash = false
        settingsMigrationForce = false
        mySkipVersionCheck = false
        hideBrowser = false
        myRestoreDefaultWindowState = false
        myRestorePlugins = true
        myCustomization = true
        dxfOutputFile = {static null = {<No data fields>}, d = 0x7fffec8a8b60 <QArrayData::shared_null>}
        dxfSymbologyMode = QgsDxfExport::SymbolLayerSymbology
        dxfScale = 50000
        dxfEncoding = {static null = {<No data fields>}, d = 0x422060 <main::{lambda()#2}::operator()() const::qstring_literal>}
        dxfMapTheme = {static null = {<No data fields>}, d = 0x7fffec8a8b60 <QArrayData::shared_null>}
        dxfExtent = {mXmin = 0, mYmin = 0, mXmax = 0, mYmax = 0}
        takeScreenShots = false
        screenShotsPath = {static null = {<No data fields>}, d = 0x7fffec8a8b60 <QArrayData::shared_null>}
        screenShotsCategories = 0
        myInitialExtent = {static null = {<No data fields>}, d = 0x4220a0 <main::{lambda()#3}::operator()() const::qstring_literal>}
        translationCode = {static null = {<No data fields>}, d = 0xa39070}
        configpath = {static null = {<No data fields>}, d = 0x7fffec8a8b60 <QArrayData::shared_null>}
        authdbdirectory = {static null = {<No data fields>}, d = 0x7fffec8a8b60 <QArrayData::shared_null>}
        pythonfile = {static null = {<No data fields>}, d = 0x7fffec8a8b60 <QArrayData::shared_null>}
        customizationfile = {static null = {<No data fields>}, d = 0x1566c20}
        globalsettingsfile = {static null = {<No data fields>}, d = 0x9f2600}
        openClProgramFolder = {static null = {<No data fields>}, d = 0x7fffec8a8b60 <QArrayData::shared_null>}
        args = {<QList<QString>> = {<QListSpecialMethods<QString>> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = {<std::__atomic_base<int>> = {static _S_alignment = 4, _M_i = -1}, <No data fields>}}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x9f4090}, d = 0x9f4090}}, <No data fields>}
        myUseGuiFlag = true
        rootProfileFolder = {static null = {<No data fields>}, d = 0x9ee5f0}

@nyalldawson
Copy link
Contributor Author

No luck with master -- I still see the issue

@rouault
Copy link
Member

rouault commented Nov 25, 2019

No luck with master

:-( Do you have a reproducer that you could share ?

@nyalldawson
Copy link
Contributor Author

@rouault check your email

rouault added a commit to rouault/PROJ that referenced this issue Nov 25, 2019
…CRS: do not mess the derivingConversion object of the original object (fixes OSGeo#1736)

normalizeForVisualization(), promoteTo3D(), demoteTo2D(), alterGeodeticCRS(),
alterCSLinearUnit() and alterParametersLinearUnit() all used the object
returned by derivingConversionRef() to create a new ProjectedCRS. While doing
so, this caused the derivingConversion of the original object to have its
targetCRS set to the object returned by normalizeForVisualization() and similar.
If that object died, then the weak pointer would be reset, and the original
ProjectedCRS() has now its derivingConversionRef()->targetCRS() nullptr

So bottom line is use derivingConversion() for anything that is not pure
reading !!!

This is confirmed to be the fix for the QGIS scenario in
qgis/QGIS#30569 (comment)

In QGIS use case, the issue arised when using a projected CRS with a non-GIS
friendly axis (that is where normalizeForVisualization() created a new projectedCRS)
rouault added a commit to rouault/PROJ that referenced this issue Nov 25, 2019
…CRS: do not mess the derivingConversion object of the original object (fixes OSGeo#1736)

normalizeForVisualization(), promoteTo3D(), demoteTo2D(), alterGeodeticCRS(),
alterCSLinearUnit() and alterParametersLinearUnit() all used the object
returned by derivingConversionRef() to create a new ProjectedCRS. While doing
so, this caused the derivingConversion of the original object to have its
targetCRS set to the object returned by normalizeForVisualization() and similar.
If that object died, then the weak pointer would be reset, and the original
ProjectedCRS() has now its derivingConversionRef()->targetCRS() nullptr

So bottom line is use derivingConversion() for anything that is not pure
reading !!!

This is confirmed to be the fix for the QGIS scenario in
qgis/QGIS#30569 (comment)

In QGIS use case, the issue arised when using a projected CRS with a non-GIS
friendly axis (that is where normalizeForVisualization() created a new projectedCRS)
@rouault
Copy link
Member

rouault commented Nov 25, 2019

@nyalldawson Good news !!! I've a fix ready in #1746

@kbevers Once the above PR passes fine for master, I'll backport it in the 6.2 branch. We should consider if we issue a urgent 6.2.2 release. Or perhaps the QGIS project will be fine to build from the HEAD of 6.2 branch or cherry-pick the patch for OSGeo4W purposes, but this also affects all platforms. So a 6.2.2 is probably required in a not so distant future.

@kbevers
Copy link
Member

kbevers commented Nov 25, 2019

We should consider if we issue a urgent 6.2.2 release. Or perhaps the QGIS project will be fine to build from the HEAD of 6.2 branch or cherry-pick the patch for OSGeo4W purposes, but this also affects all platforms. So a 6.2.2 is probably required in a not so distant future.

As far as I can tell the next QGIS release is scheduled for the 29th of November. I am not sure I can find the time to fit in a PROJ release before that. I can probably make it for a December 1st release but I don't know if that would be useful for the QGIS guys.

rouault added a commit that referenced this issue Nov 25, 2019
normalizeForVisualization() and other methods applying on a ProjectedCRS: do not mess the derivingConversion object of the original object (fixes #1736)
rouault added a commit that referenced this issue Nov 25, 2019
…CRS: do not mess the derivingConversion object of the original object (fixes #1736)

normalizeForVisualization(), promoteTo3D(), demoteTo2D(), alterGeodeticCRS(),
alterCSLinearUnit() and alterParametersLinearUnit() all used the object
returned by derivingConversionRef() to create a new ProjectedCRS. While doing
so, this caused the derivingConversion of the original object to have its
targetCRS set to the object returned by normalizeForVisualization() and similar.
If that object died, then the weak pointer would be reset, and the original
ProjectedCRS() has now its derivingConversionRef()->targetCRS() nullptr

So bottom line is use derivingConversion() for anything that is not pure
reading !!!

This is confirmed to be the fix for the QGIS scenario in
qgis/QGIS#30569 (comment)

In QGIS use case, the issue arised when using a projected CRS with a non-GIS
friendly axis (that is where normalizeForVisualization() created a new projectedCRS)
@rouault
Copy link
Member

rouault commented Nov 25, 2019

Pull request fixing in master merged, and cherry-picked in 6.2 branch per bce4b15

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants