Re: Segfault when trying to edit cylinder information - solved!

2017-06-14 Thread Pedro Neves

On 13-06-2017 23:48, Lubomir I. Ivanov wrote:

but it's probably best for you
to still upload the whole divelog @ dropbox, so that we can test with
it and find the*real*  cause.


Lubomir:

I'll try to narrow down the problem in order to create a smaller file 
that contains the problem...


I'll keep you posted.


Cheers:

Pedro

___
subsurface mailing list
subsurface@subsurface-divelog.org
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface


Re: Segfault when trying to edit cylinder information - solved!

2017-06-13 Thread Lubomir I. Ivanov
On 14 June 2017 at 01:31, Pedro Neves  wrote:
> On 13-06-2017 23:19, Lubomir I. Ivanov wrote:
>
> git apply test_tank_info_model_fix.patch
>
> Lubomir:
>
> After applying your patch it all works as supposed. I can edit cylinder info
> without any problems.
>
> Thanks a lot!
>

thanks for checking,
i've signed-off a patch with this fix, but it's probably best for you
to still upload the whole divelog @ dropbox, so that we can test with
it and find the *real* cause.

lubomir
--
___
subsurface mailing list
subsurface@subsurface-divelog.org
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface


Re: Segfault when trying to edit cylinder information - solved!

2017-06-13 Thread Pedro Neves

On 13-06-2017 23:19, Lubomir I. Ivanov wrote:

git apply test_tank_info_model_fix.patch


Lubomir:

After applying your patch it all works as supposed. I can edit cylinder 
info without any problems.


Thanks a lot!

Cheers:

Pedro

___
subsurface mailing list
subsurface@subsurface-divelog.org
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface


Re: Segfault when trying to edit cylinder information

2017-06-13 Thread Lubomir I. Ivanov
On 14 June 2017 at 01:01, Pedro Neves  wrote:
> On 13-06-2017 22:43, Lubomir I. Ivanov wrote:
>
> replace it with the following:
> const int test_row = index.row();
> fprintf(stderr, "TEST_ROW: %d\n", test_row); // include  if needed
> struct tank_info_t *info = _info[test_row];
>
> Lubomir:
>
> This is what I get now:
>
>



> TEST_ROW: 100
> TEST_ROW: 101
> Segmentation fault (core dumped)
>

row values seem to go above 99.
please try reseting the tankinfomodel.cpp changes and apply the attached patch

(git apply test_tank_info_model_fix.patch)

and rebuild / retest.

if it works we have a "clamp" solution, but the real cause is unknown.
the QModelIndex should not return row values above the maximum size of
our tank_info buffer.

lubomir
--
diff --git a/core/dive.h b/core/dive.h
index c65d3ff..2565b4a 100644
--- a/core/dive.h
+++ b/core/dive.h
@@ -296,6 +296,7 @@ struct divecomputer {
 
 #define MAX_CYLINDERS (20)
 #define MAX_WEIGHTSYSTEMS (6)
+#define MAX_TANK_INFO (100)
 #define W_IDX_PRIMARY 0
 #define W_IDX_SECONDARY 1
 
@@ -923,7 +924,7 @@ struct tank_info_t {
 	const char *name;
 	int cuft, ml, psi, bar;
 };
-extern struct tank_info_t tank_info[100];
+extern struct tank_info_t tank_info[MAX_TANK_INFO];
 
 struct ws_info_t {
 	const char *name;
diff --git a/qt-models/tankinfomodel.cpp b/qt-models/tankinfomodel.cpp
index 75303d8..97f0e80 100644
--- a/qt-models/tankinfomodel.cpp
+++ b/qt-models/tankinfomodel.cpp
@@ -28,6 +28,10 @@ bool TankInfoModel::setData(const QModelIndex , const QVariant , int
 {
 	//WARN Seems wrong, we need to check for role == Qt::EditRole
 	Q_UNUSED(role);
+
+	if (index.row() < 0 || index.row() > MAX_TANK_INFO - 1)
+		return false;
+
 	struct tank_info_t *info = _info[index.row()];
 	switch (index.column()) {
 	case DESCRIPTION:
@@ -51,7 +55,7 @@ void TankInfoModel::clear()
 QVariant TankInfoModel::data(const QModelIndex , int role) const
 {
 	QVariant ret;
-	if (!index.isValid()) {
+	if (!index.isValid() || index.row() < 0 || index.row() > MAX_TANK_INFO - 1) {
 		return ret;
 	}
 	if (role == Qt::FontRole) {
___
subsurface mailing list
subsurface@subsurface-divelog.org
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface


Re: Segfault when trying to edit cylinder information

2017-06-13 Thread Pedro Neves

On 13-06-2017 22:43, Lubomir I. Ivanov wrote:

replace it with the following:
const int test_row = index.row();
fprintf(stderr, "TEST_ROW: %d\n", test_row); // include  if needed
struct tank_info_t *info = _info[test_row];


Lubomir:

This is what I get now:


TEST_ROW: 0
TEST_ROW: 0
TEST_ROW: 0
TEST_ROW: 0
TEST_ROW: 1
TEST_ROW: 2
TEST_ROW: 3
TEST_ROW: 4
TEST_ROW: 5
TEST_ROW: 6
TEST_ROW: 7
TEST_ROW: 8
TEST_ROW: 9
TEST_ROW: 10
TEST_ROW: 11
TEST_ROW: 12
TEST_ROW: 13
TEST_ROW: 14
TEST_ROW: 15
TEST_ROW: 16
TEST_ROW: 17
TEST_ROW: 18
TEST_ROW: 19
TEST_ROW: 20
TEST_ROW: 21
TEST_ROW: 22
TEST_ROW: 23
TEST_ROW: 24
TEST_ROW: 25
TEST_ROW: 26
TEST_ROW: 27
TEST_ROW: 28
TEST_ROW: 29
TEST_ROW: 30
TEST_ROW: 31
TEST_ROW: 32
TEST_ROW: 33
TEST_ROW: 34
TEST_ROW: 35
TEST_ROW: 36
TEST_ROW: 37
TEST_ROW: 38
TEST_ROW: 39
TEST_ROW: 40
TEST_ROW: 41
TEST_ROW: 42
TEST_ROW: 43
TEST_ROW: 44
TEST_ROW: 45
TEST_ROW: 46
TEST_ROW: 47
TEST_ROW: 48
TEST_ROW: 49
TEST_ROW: 50
TEST_ROW: 51
TEST_ROW: 52
TEST_ROW: 53
TEST_ROW: 54
TEST_ROW: 55
TEST_ROW: 56
TEST_ROW: 57
TEST_ROW: 58
TEST_ROW: 59
TEST_ROW: 60
TEST_ROW: 61
TEST_ROW: 62
TEST_ROW: 63
TEST_ROW: 64
TEST_ROW: 65
TEST_ROW: 66
TEST_ROW: 67
TEST_ROW: 68
TEST_ROW: 69
TEST_ROW: 70
TEST_ROW: 71
TEST_ROW: 72
TEST_ROW: 73
TEST_ROW: 74
TEST_ROW: 75
TEST_ROW: 76
TEST_ROW: 77
TEST_ROW: 78
TEST_ROW: 79
TEST_ROW: 80
TEST_ROW: 81
TEST_ROW: 82
TEST_ROW: 83
TEST_ROW: 84
TEST_ROW: 85
TEST_ROW: 86
TEST_ROW: 87
TEST_ROW: 88
TEST_ROW: 89
TEST_ROW: 90
TEST_ROW: 91
TEST_ROW: 92
TEST_ROW: 93
TEST_ROW: 94
TEST_ROW: 95
TEST_ROW: 96
TEST_ROW: 97
TEST_ROW: 98
TEST_ROW: 99
TEST_ROW: 100
TEST_ROW: 101
Segmentation fault (core dumped)

Ideas?


Cheers:

Pedro

___
subsurface mailing list
subsurface@subsurface-divelog.org
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface


Re: Segfault when trying to edit cylinder information

2017-06-13 Thread Lubomir I. Ivanov
On 13 June 2017 at 23:58, Thiago Macieira  wrote:
> On terça-feira, 13 de junho de 2017 13:16:21 PDT Lubomir I. Ivanov wrote:
>> i cannot reproduce the problem, but also the above should not happen
>> as we allocate the cylinder "type" (tank_info_t->name) on the heap and
>> it's address cannot be so low (0x1770).
>
> It comes from:
>
> struct tank_info_t *info = _info[index.row()];
>
> which is a global variable in core/equipment.c:
>
> struct tank_info_t tank_info[100] = {
> ...
> };
>
> and has been so since 2013. I don't see how
>  a) tank_info could be wrong (unless it's a major compilation problem)
>  and
>  b) how index.row() could have been so exactly wrong to produce a pointer in
> the second memory page (it's too much of a coincidence)

hmm, both are possible.
i would be bet on b) as i haven't seen anything like a) in recent GCC
- not that it's bug free.

lubomir
--
___
subsurface mailing list
subsurface@subsurface-divelog.org
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface


Re: Segfault when trying to edit cylinder information

2017-06-13 Thread Lubomir I. Ivanov
On 14 June 2017 at 00:30, Pedro Neves  wrote:
> Lubomir:
>
> On 13-06-2017 21:16, Lubomir I. Ivanov wrote:
>>
>>
>> random questions:
>> - are you running from an app-image or is this your build?
>
> It happens both with my build and with the appimage

it's good that you are building yourself.

please, open the file qt-models/tankinfomodel.cpp and find the method:
QVariant TankInfoModel::data(const QModelIndex , int role) const

inside the method find this line:
struct tank_info_t *info = _info[index.row()];

replace it with the following:
const int test_row = index.row();
fprintf(stderr, "TEST_ROW: %d\n", test_row); // include  if needed
struct tank_info_t *info = _info[test_row];

rebuild subsurface and reproduce the crash, while looking for the
TEST_ROW output in the terminal.

something else you can do add the same fprintf() snippet for the
index.row() in this method:
bool TankInfoModel::setData(const QModelIndex , const QVariant
, int role)

if the row values are negative or larger than 99 (?) something went wrong.

>>
>> - which OS / subsurface version?
>
>
> Arch Linux / Latest from master or with 4.6.4 appimage
>
>> - does it happen if you plan a dive and insert a new cylinder?
>
> Yes.

even if you start subsurface with a blank logbook?

>
>> - can you send a file where it happens consistently + plus exact steps
>> to reproduce it?
>
>
> I've made a few more tests with other logbooks and It seems that it happens
> only with my log... There must me something wrong with it. However, I'll
> have to place it on a Dropbox as it's 42 Mb... Does anyone have any ideas
> where I should start looking?
>

that's a big logfile. the size itself might contribute to the problem
- e.g. memory corruption that we need to prevent.

lubomir
--
___
subsurface mailing list
subsurface@subsurface-divelog.org
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface


Re: Segfault when trying to edit cylinder information

2017-06-13 Thread Pedro Neves

Lubomir:

On 13-06-2017 21:16, Lubomir I. Ivanov wrote:


random questions:
- are you running from an app-image or is this your build?

It happens both with my build and with the appimage

- which OS / subsurface version?


Arch Linux / Latest from master or with 4.6.4 appimage


- does it happen if you plan a dive and insert a new cylinder?

Yes.


- can you send a file where it happens consistently + plus exact steps
to reproduce it?


I've made a few more tests with other logbooks and It seems that it 
happens only with my log... There must me something wrong with it. 
However, I'll have to place it on a Dropbox as it's 42 Mb... Does anyone 
have any ideas where I should start looking?


Cheers:

Pedro


___
subsurface mailing list
subsurface@subsurface-divelog.org
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface


Re: Segfault when trying to edit cylinder information

2017-06-13 Thread Thiago Macieira
On terça-feira, 13 de junho de 2017 13:16:21 PDT Lubomir I. Ivanov wrote:
> i cannot reproduce the problem, but also the above should not happen
> as we allocate the cylinder "type" (tank_info_t->name) on the heap and
> it's address cannot be so low (0x1770).

It comes from:

struct tank_info_t *info = _info[index.row()];

which is a global variable in core/equipment.c:

struct tank_info_t tank_info[100] = {
...
};

and has been so since 2013. I don't see how
 a) tank_info could be wrong (unless it's a major compilation problem)
 and
 b) how index.row() could have been so exactly wrong to produce a pointer in 
the second memory page (it's too much of a coincidence)

Not to mention that index was created by QComboBox, as a result of resize 
operation, so even if there's another QModelIndex in the stack, it shouldn't 
have had an effect -- not to mention that those were also generated by Qt.

-- 
Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org
   Software Architect - Intel Open Source Technology Center

___
subsurface mailing list
subsurface@subsurface-divelog.org
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface


Re: Segfault when trying to edit cylinder information

2017-06-13 Thread Lubomir I. Ivanov
On 13 June 2017 at 22:38, Pedro Neves  wrote:
>
> #0  0x7fffef3b51a6 in strlen () at /usr/lib/libc.so.6
> #1  0x005a5c33 in QString::QString(char const*)
> (this=0x7fffcbd0, ch=0x1770  0x1770>) at /usr/include/qt/QtCore/qstring.h:659
> #2  0x0072e14d in TankInfoModel::data(QModelIndex const&, int) const
> (this=0x10ae1f0, index=..., role=2) at
> /home//Diveapps/subsurface/qt-models/tankinfomodel.cpp:76


that's very odd,

i cannot reproduce the problem, but also the above should not happen
as we allocate the cylinder "type" (tank_info_t->name) on the heap and
it's address cannot be so low (0x1770).

random questions:
- are you running from an app-image or is this your build?
- which OS / subsurface version?
- does it happen if you plan a dive and insert a new cylinder?
- can you send a file where it happens consistently + plus exact steps
to reproduce it?

lubomir
--
___
subsurface mailing list
subsurface@subsurface-divelog.org
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface


Re: Segfault when trying to edit cylinder information

2017-06-13 Thread Pedro Neves

On 13-06-2017 19:14, Thiago Macieira wrote:

type 'bt" when you get above.


Thiago, my bad ;-)


(gdb) bt
#0  0x7fffef3b51a6 in strlen () at /usr/lib/libc.so.6
#1  0x005a5c33 in QString::QString(char const*) 
(this=0x7fffcbd0, ch=0x1770 0x1770>) at /usr/include/qt/QtCore/qstring.h:659
#2  0x0072e14d in TankInfoModel::data(QModelIndex const&, int) 
const (this=0x10ae1f0, index=..., role=2) at 
/home//Diveapps/subsurface/qt-models/tankinfomodel.cpp:76

#3  0x73ae4e3d in  () at /usr/lib/libQt5Widgets.so.5
#4  0x73ae5b99 in QComboBox::itemText(int) const () at 
/usr/lib/libQt5Widgets.so.5

#5  0x73ae61b1 in  () at /usr/lib/libQt5Widgets.so.5
#6  0x73a1f67d in QWidgetPrivate::adjustedSize() const () at 
/usr/lib/libQt5Widgets.so.5
#7  0x73a2e16a in QWidget::adjustSize() () at 
/usr/lib/libQt5Widgets.so.5
#8  0x73aea24d in QComboBox::setEditable(bool) () at 
/usr/lib/libQt5Widgets.so.5
#9  0x006c0276 in ComboBoxDelegate::createEditor(QWidget*, 
QStyleOptionViewItem const&, QModelIndex const&) const (this=0x10ae1a0, 
parent=0x11eafa0, option=..., index=...)
at 
/home/xxx/Diveapps/subsurface/desktop-widgets/modeldelegates.cpp:118
#10 0x006c162a in TankInfoDelegate::createEditor(QWidget*, 
QStyleOptionViewItem const&, QModelIndex const&) const (this=0x10ae1a0, 
parent=0x11eafa0, option=..., index=...)
at 
/home/xx/Diveapps/subsurface/desktop-widgets/modeldelegates.cpp:302

#11 0x73c3eb90 in  () at /usr/lib/libQt5Widgets.so.5
#12 0x73c3ed98 in  () at /usr/lib/libQt5Widgets.so.5
#13 0x73c3efba in QAbstractItemView::edit(QModelIndex const&, 
QAbstractItemView::EditTrigger, QEvent*) () at /usr/lib/libQt5Widgets.so.5
#14 0x73c37b78 in QAbstractItemView::edit(QModelIndex const&) () 
at /usr/lib/libQt5Widgets.so.5
#15 0x006c5df4 in TableView::edit(QModelIndex const&) 
(this=0x137f4d0, index=...) at 
/home/xxx/Diveapps/subsurface/desktop-widgets/tableview.cpp:134
#16 0x006622ba in MainTab::editCylinderWidget(QModelIndex 
const&) (this=0x10c71d0, index=...) at 
/home/x/Diveapps/subsurface/desktop-widgets/tab-widgets/maintab.cpp:1460
#17 0x0068c184 in MainTab::qt_static_metacall(QObject*, 
QMetaObject::Call, int, void**) (_o=0x10c71d0, 
_c=QMetaObject::InvokeMetaMethod, _id=29, _a=0x7fffd420)
at 
/home/x/Diveapps/subsurface/build/desktop-widgets/subsurface_interface_autogen/VKEPO7FSIR/moc_maintab.cpp:281
#18 0x7fffeff2c465 in QMetaObject::activate(QObject*, int, int, 
void**) () at /usr/lib/libQt5Core.so.5
#19 0x73c36f35 in QAbstractItemView::clicked(QModelIndex const&) 
() at /usr/lib/libQt5Widgets.so.5
#20 0x73c3a03b in 
QAbstractItemView::mouseReleaseEvent(QMouseEvent*) () at 
/usr/lib/libQt5Widgets.so.5
#21 0x73a31d68 in QWidget::event(QEvent*) () at 
/usr/lib/libQt5Widgets.so.5
#22 0x73b112de in QFrame::event(QEvent*) () at 
/usr/lib/libQt5Widgets.so.5
#23 0x73c42e6b in QAbstractItemView::viewportEvent(QEvent*) () 
at /usr/lib/libQt5Widgets.so.5
#24 0x7fffefefd87c in 
QCoreApplicationPrivate::sendThroughObjectEventFilters(QObject*, 
QEvent*) () at /usr/lib/libQt5Core.so.5
#25 0x739f1445 in QApplicationPrivate::notify_helper(QObject*, 
QEvent*) () at /usr/lib/libQt5Widgets.so.5
#26 0x739f924f in QApplication::notify(QObject*, QEvent*) () at 
/usr/lib/libQt5Widgets.so.5
#27 0x7fffefefdb98 in QCoreApplication::notifyInternal2(QObject*, 
QEvent*) () at /usr/lib/libQt5Core.so.5
#28 0x739f8222 in QApplicationPrivate::sendMouseEvent(QWidget*, 
QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer&, bool) 
() at /usr/lib/libQt5Widgets.so.5

#29 0x73a4c8db in  () at /usr/lib/libQt5Widgets.so.5
#30 0x73a4ef4a in  () at /usr/lib/libQt5Widgets.so.5
#31 0x739f146c in QApplicationPrivate::notify_helper(QObject*, 
QEvent*) () at /usr/lib/libQt5Widgets.so.5
#32 0x739f8cf4 in QApplication::notify(QObject*, QEvent*) () at 
/usr/lib/libQt5Widgets.so.5
#33 0x7fffefefdb98 in QCoreApplication::notifyInternal2(QObject*, 
QEvent*) () at /usr/lib/libQt5Core.so.5
#34 0x7073ea93 in 
QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent*) 
() at /usr/lib/libQt5Gui.so.5
#35 0x70740575 in 
QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent*) 
() at /usr/lib/libQt5Gui.so.5
#36 0x70718c0b in 
QWindowSystemInterface::sendWindowSystemEvents(QFlags) 
() at /usr/lib/libQt5Gui.so.5

#37 0x7fffe30ee1b0 in  () at /usr/lib/libQt5XcbQpa.so.5
#38 0x7fffeb70ba47 in g_main_context_dispatch () at 
/usr/lib/libglib-2.0.so.0

#39 0x7fffeb70bc78 in  () at /usr/lib/libglib-2.0.so.0
#40 0x7fffeb70bd0c in g_main_context_iteration () at 
/usr/lib/libglib-2.0.so.0
#41 0x7fffeff55e7f in 
QEventDispatcherGlib::processEvents(QFlags) 
() at 

Segfault when trying to edit cylinder information

2017-06-13 Thread Pedro Neves

Hi all:

I've been facing a segfault with Subsurface each time I try to insert 
cylinder information of my dives. After I download my new dives, I'm 
able to fill the Start press., End press, the Work press. and the O2%. 
But when I click the Type or Size, I get a segfault. This happens both 
with my log and with an empty divelog. Even if I delete Subsurface 
configs (in .config/Subsurface).


Here's what I get with gdb:

(gdb) run
Starting program: /home/xx/Diveapps/subsurface/build/subsurface 
subsurface/build/subsurface

[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
[New Thread 0x7fffe02f2700 (LWP 22165)]
[New Thread 0x7fffd3768700 (LWP 22166)]
[New Thread 0x7fffcbbc6700 (LWP 22167)]
[New Thread 0x7fffcad25700 (LWP 22168)]
[New Thread 0x7fffca524700 (LWP 22169)]
[Thread 0x7fffcad25700 (LWP 22168) exited]
[New Thread 0x7fffcad25700 (LWP 22170)]
[Thread 0x7fffca524700 (LWP 22169) exited]
[New Thread 0x7fffca524700 (LWP 22171)]
[New Thread 0x7fffcad25700 (LWP 22172)]
[Thread 0x7fffcad25700 (LWP 22170) exited]
[Thread 0x7fffca524700 (LWP 22171) exited]
[Thread 0x7fffcad25700 (LWP 22172) exited]
[New Thread 0x7fffcad25700 (LWP 22173)]
[New Thread 0x7fffca524700 (LWP 22174)]
[New Thread 0x7fffc2ea5700 (LWP 22175)]
[New Thread 0x7fffc26a4700 (LWP 22176)]
[New Thread 0x7fffc1ea3700 (LWP 22177)]
subsurface/build/subsurface:1: parser error : Start tag expected, '<' 
not found

ELF
^
subsurface/build/subsurface:1: parser error : Start tag expected, '<' 
not found

ELF
^
[New Thread 0x7fffc0861700 (LWP 22178)]
[New Thread 0x7fff7bffd700 (LWP 22179)]
[New Thread 0x7fff7aee7700 (LWP 22180)]
[New Thread 0x7fff7a6e6700 (LWP 22181)]
[New Thread 0x7fff79ee5700 (LWP 22182)]
[New Thread 0x7fff796e4700 (LWP 22183)]
[Thread 0x7fff79ee5700 (LWP 22182) exited]
[Thread 0x7fff796e4700 (LWP 22183) exited]
[Thread 0x7fff7a6e6700 (LWP 22181) exited]
[Thread 0x7fff7aee7700 (LWP 22180) exited]
[New Thread 0x7fff796e4700 (LWP 22184)]
[New Thread 0x7fff79ee5700 (LWP 22185)]
[New Thread 0x7fff7a6e6700 (LWP 22186)]
[New Thread 0x7fff7aee7700 (LWP 22187)]
[New Thread 0x7fff78cdd700 (LWP 22188)]
[New Thread 0x7fff53fff700 (LWP 22189)]
[Thread 0x7fff7aee7700 (LWP 22187) exited]
[Thread 0x7fff78cdd700 (LWP 22188) exited]
[Thread 0x7fff7a6e6700 (LWP 22186) exited]
[Thread 0x7fff53fff700 (LWP 22189) exited]
[New Thread 0x7fff53fff700 (LWP 22190)]
[New Thread 0x7fff78cdd700 (LWP 22191)]
[New Thread 0x7fff7aee7700 (LWP 22192)]
[New Thread 0x7fff7a6e6700 (LWP 22193)]
[Thread 0x7fff53fff700 (LWP 22190) exited]
[Thread 0x7fff78cdd700 (LWP 22191) exited]
[Thread 0x7fff7aee7700 (LWP 22192) exited]
[Thread 0x7fff7a6e6700 (LWP 22193) exited]
[New Thread 0x7fff7a6e6700 (LWP 22194)]
[New Thread 0x7fff7aee7700 (LWP 22195)]
[New Thread 0x7fff78cdd700 (LWP 22196)]
[New Thread 0x7fff53fff700 (LWP 22197)]
[Thread 0x7fff7aee7700 (LWP 22195) exited]
[Thread 0x7fff7a6e6700 (LWP 22194) exited]
[Thread 0x7fff78cdd700 (LWP 22196) exited]
[Thread 0x7fff53fff700 (LWP 22197) exited]
[New Thread 0x7fff53fff700 (LWP 22198)]
[New Thread 0x7fff78cdd700 (LWP 22199)]
[New Thread 0x7fff7aee7700 (LWP 22200)]
[New Thread 0x7fff7a6e6700 (LWP 22201)]
[Thread 0x7fff7aee7700 (LWP 22200) exited]
[Thread 0x7fff7a6e6700 (LWP 22201) exited]
[Thread 0x7fff78cdd700 (LWP 22199) exited]
[Thread 0x7fff53fff700 (LWP 22198) exited]
[New Thread 0x7fff7a6e6700 (LWP 22204)]
[New Thread 0x7fff7aee7700 (LWP 22205)]
[New Thread 0x7fff78cdd700 (LWP 22206)]
[New Thread 0x7fff53fff700 (LWP 22207)]
[Thread 0x7fff7aee7700 (LWP 22205) exited]
[Thread 0x7fff7a6e6700 (LWP 22204) exited]
[Thread 0x7fff78cdd700 (LWP 22206) exited]
[Thread 0x7fff53fff700 (LWP 22207) exited]
[New Thread 0x7fff53fff700 (LWP 22212)]
[New Thread 0x7fff78cdd700 (LWP 22213)]
[New Thread 0x7fff7aee7700 (LWP 22214)]
[New Thread 0x7fff7a6e6700 (LWP 22215)]
[New Thread 0x7fff5211e700 (LWP 22218)]
[New Thread 0x7fff5191d700 (LWP 22219)]
[New Thread 0x7fff5111c700 (LWP 0)]
[New Thread 0x7fff5091b700 (LWP 1)]
[Thread 0x7fff5191d700 (LWP 22219) exited]
[Thread 0x7fff5091b700 (LWP 1) exited]
[Thread 0x7fff5111c700 (LWP 0) exited]
[Thread 0x7fff5211e700 (LWP 22218) exited]
[New Thread 0x7fff5091b700 (LWP 2)]
[New Thread 0x7fff5111c700 (LWP 3)]
[New Thread 0x7fff5191d700 (LWP 4)]
[New Thread 0x7fff5211e700 (LWP 5)]
[Thread 0x7fff5211e700 (LWP 5) exited]
[Thread 0x7fff5191d700 (LWP 4) exited]
[Thread 0x7fff5111c700 (LWP 3) exited]
[Thread 0x7fff5091b700 (LWP 2) exited]
[New Thread 0x7fff5211e700 (LWP 6)]
[New Thread 0x7fff5191d700 (LWP 7)]
[New Thread 0x7fff5111c700 (LWP 8)]
[New Thread 0x7fff5091b700 (LWP 9)]
[Thread 0x7fff5191d700 (LWP 7) exited]
[Thread 0x7fff5211e700 (LWP 6) exited]
[Thread 0x7fff5111c700 (LWP 8) exited]
[Thread 0x7fff5091b700 (LWP 9) exited]
[New Thread 0x7fff5091b700 (LWP 22230)]
[New Thread 0x7fff5111c700 (LWP 22231)]
[New Thread 0x7fff5191d700 (LWP 22232)]
[New Thread