<div dir="ltr"><div>These situations came up in a separate conversation with Ed Maste, and I'm e-mailing to get thoughts on what the expected behavior would be.</div><div><br></div><div>This is all done with clang 3.3 on Ubuntu 12.04 x64. Code here: <a href="https://gist.github.com/mikesart/6467648">https://gist.github.com/mikesart/6467648</a></div>

<div><br></div><div>For case #1, I set a breakpoint on the final printf() statement, hit run, and everything runs like I'd expect.</div><div><br></div><div>For case #2, I set a breakpoint on the sleep call in the threadproc, and the sleep call in main.</div>

<div> - When it hits the breakpoint in threadproc, it also seems to hit some thread spawned breakpoint at the same time. Is this expected? We don't see anything about this breakpoint in the first run.</div><div> - When I type "n", it looks like we hit two breakpoints again at the same time - the one in main and the one in threadproc. This also seems a bit confusing. Which thread am I on? I don't believe I've ever used a debugger that shows two breakpoints being hit at the same time before. Would it make sense to queue them up and show them one at a time?</div>

<div><br></div><div>Thanks.</div><div> -Mike</div><div><br></div><div>#</div><div># Case 1: breakpoint on last statement in app</div><div>#</div><div>mikesart@mikesart64:~/data/src/blah/build64$ lldb -- pthreads</div><div>

Current executable set to 'pthreads' (x86_64).</div><div>(lldb) # set breakpoint on last printf statement in test app</div><div>(lldb) b 122</div><div>Breakpoint 1: where = pthreads`main + 611 at pthreads.cpp:122, address = 0x00000000004010b3</div>

<div>(lldb) r</div><div>Process 13815 launched: '/home/mikesart/data/src/blah/build64/pthreads' (x86_64)</div><div>num_threads:2</div><div>'mainthrd' [#-1 LWP:-1 0x7fc8fba1a740] pthread_create:0 (Success) pthread_t:7fc8fa82c700</div>

<div>'thread_0' [#0 LWP:-1 0x7fc8fa82c700] pthread_setname_np('thread_0')</div><div>'thread_0' [#0 LWP:-1 0x7fc8fa82c700] sleep(5)</div><div>'mainthrd' [#-1 LWP:-1 0x7fc8fba1a740] pthread_create:0 (Success) pthread_t:7fc8fa02b700</div>

<div>'thread_1' [#1 LWP:-1 0x7fc8fa02b700] pthread_setname_np('thread_1')</div><div>'thread_1' [#1 LWP:-1 0x7fc8fa02b700] sleep(5)</div><div>'mainthrd' [#-1 LWP:-1 0x7fc8fba1a740] Waiting for thread #0</div>

<div>'thread_0' [#0 LWP:-1 0x7fc8fa82c700] pthread_exit(-1)</div><div>'thread_1' [#1 LWP:-1 0x7fc8fa02b700] pthread_exit(-1)</div><div>'mainthrd' [#-1 LWP:-1 0x7fc8fba1a740] Thread #0 rc:0 status:-1</div>

<div>'mainthrd' [#-1 LWP:-1 0x7fc8fba1a740] Waiting for thread #1</div><div>'mainthrd' [#-1 LWP:-1 0x7fc8fba1a740] Thread #1 rc:0 status:-1</div><div>Process 13815 stopped</div><div>* thread #1: tid = 13815, 0x00000000004010b3 pthreads`main(argc=1, argv=0x00007ffff37f4048) + 611 at pthreads.cpp:122, name = 'pthreads', stop reason = breakpoint 1.1</div>

<div>    frame #0: 0x00000000004010b3 pthreads`main(argc=1, argv=0x00007ffff37f4048) + 611 at pthreads.cpp:122</div><div>   119          logit("Thread #%zu rc:%d status:%d\n", i, rc, (int)(intptr_t)status);</div>

<div>   120      }</div><div>   121 </div><div>-> 122      printf("done.\n");</div><div>   123      return 0;</div><div>   124  }</div><div>(lldb)</div><div><br></div><div>#<br></div><div><div># Case 2: breakpoint on sleep in threadproc and sleep in main, then hit "next"</div>

<div>#</div></div><div><div>mikesart@mikesart64:~/data/src/blah/build64$ lldb -- pthreads</div><div>Current executable set to 'pthreads' (x86_64).</div><div>(lldb) # breakpoint on sleep in threadproc and sleep in main</div>

<div>(lldb) b 81</div><div>Breakpoint 1: where = pthreads`thread_proc(void*) + 152 at pthreads.cpp:81, address = 0x0000000000400e18</div><div>(lldb) b 111</div><div>Breakpoint 2: where = pthreads`main + 431 at pthreads.cpp:111, address = 0x0000000000400fff</div>

<div>(lldb) r</div><div>Process 16446 launched: '/home/mikesart/data/src/blah/build64/pthreads' (x86_64)</div><div>num_threads:2</div><div>'mainthrd' [#-1 LWP:-1 0x7fb7de190740] pthread_create:0 (Success) pthread_t:7fb7dcfa2700</div>

<div>'thread_0' [#0 LWP:-1 0x7fb7dcfa2700] pthread_setname_np('thread_0')</div><div>'thread_0' [#0 LWP:-1 0x7fb7dcfa2700] sleep(5)</div><div>Process 16446 stopped</div><div>  thread #1: tid = 16446, 0x00007fb7dd096c91 libc.so.6`__clone + 49 at clone.S:84, name = 'pthreads', stop reason = thread spawned</div>

<div>    frame #0: 0x00007fb7dd096c91 libc.so.6`__clone + 49 at clone.S:84</div><div>   81           cfi_endproc;</div><div>   82           syscall</div><div>   83  </div><div>-> 84           testq   %rax,%rax</div><div>

   85           jl      SYSCALL_ERROR_LABEL</div><div>   86           jz      L(thread_start)</div><div>   87  </div><div>* thread #2: tid = 16450, 0x0000000000400e18 pthreads`thread_proc(arg=0x0000000000000000) + 152 at pthreads.cpp:81, name = 'pthreads', stop reason = breakpoint 1.1</div>

<div>    frame #0: 0x0000000000400e18 pthreads`thread_proc(arg=0x0000000000000000) + 152 at pthreads.cpp:81</div><div>   78       setname(g_threadname);</div><div>   79  </div><div>   80       logit("sleep(5)\n");</div>

<div>-> 81       sleep(5);</div><div>   82  </div><div>   83       pid_t tid = gettid();</div><div>   84       logit("pthread_exit(%d)\n", tid);</div><div>(lldb) n</div><div>(lldb) 'mainthrd' [#-1 LWP:-1 0x7fb7de190740] pthread_create:0 (Success) pthread_t:7fb7dc7a1700</div>

<div>'thread_1' [#1 LWP:-1 0x7fb7dc7a1700] pthread_setname_np('thread_1')</div><div>'thread_1' [#1 LWP:-1 0x7fb7dc7a1700] sleep(5)</div><div>Process 16446 stopped</div><div>* thread #1: tid = 16446, 0x0000000000400fff pthreads`main(argc=1, argv=0x00007fffbddb6d98) + 431 at pthreads.cpp:111, name = 'pthreads', stop reason = breakpoint 2.1</div>

<div>    frame #0: 0x0000000000400fff pthreads`main(argc=1, argv=0x00007fffbddb6d98) + 431 at pthreads.cpp:111</div><div>   108          logit("pthread_create:%d (%s) pthread_t:%lx\n", err, strerror(err), threadids[i]);</div>

<div>   109      }</div><div>   110 </div><div>-> 111      sleep(1);</div><div>   112 </div><div>   113      for(size_t i = 0; i < num_threads; i++)</div><div>   114      {</div><div>  thread #3: tid = 16451, 0x0000000000400e18 pthreads`thread_proc(arg=0x0000000000000001) + 152 at pthreads.cpp:81, name = 'pthreads', stop reason = breakpoint 1.1</div>

<div>    frame #0: 0x0000000000400e18 pthreads`thread_proc(arg=0x0000000000000001) + 152 at pthreads.cpp:81</div><div>   78       setname(g_threadname);</div><div>   79  </div><div>   80       logit("sleep(5)\n");</div>

<div>-> 81       sleep(5);</div><div>   82  </div><div>   83       pid_t tid = gettid();</div><div>   84       logit("pthread_exit(%d)\n", tid);</div><div><div>(lldb) bt</div><div>* thread #1: tid = 23965, 0x0000000000400fff pthreads`main(argc=1, argv=0x00007fff4d574e48) + 431 at pthreads.cpp:111, name = 'pthreads', stop reason = breakpoint 2.1</div>

<div>    frame #0: 0x0000000000400fff pthreads`main(argc=1, argv=0x00007fff4d574e48) + 431 at pthreads.cpp:111</div><div>    frame #1: 0x00007f85a8fc676d libc.so.6`__libc_start_main(main=0x0000000000400e50, argc=1, ubp_av=0x00007fff4d574e48, init=<unavailable>, fini=<unavailable>, rtld_fini=<unavailable>, stack_end=0x00007fff4d574e38) + 237 at libc-start.c:226</div>

</div></div><div><br></div><div>#<br></div><div><div># Same run with gdb</div><div>#</div><div>mikesart@mikesart64:~/data/src/blah/build64$ gdb -- pthreads</div><div>GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04</div>

<div>Copyright (C) 2012 Free Software Foundation, Inc.</div><div>License GPLv3+: GNU GPL version 3 or later <<a href="http://gnu.org/licenses/gpl.html">http://gnu.org/licenses/gpl.html</a>></div><div>This is free software: you are free to change and redistribute it.</div>

<div>There is NO WARRANTY, to the extent permitted by law.  Type "show copying"</div><div>and "show warranty" for details.</div><div>This GDB was configured as "x86_64-linux-gnu".</div><div>
For bug reporting instructions, please see:</div>
<div><<a href="http://bugs.launchpad.net/gdb-linaro/">http://bugs.launchpad.net/gdb-linaro/</a>>...</div><div>Reading symbols from /home/mikesart/data/src/blah/build64/pthreads...done.</div><div>(gdb) b 81 </div><div>

Breakpoint 1 at 0x400e18: file /home/mikesart/data/src/blah/pthreads.cpp, line 81.</div><div>(gdb) b 111</div><div>Breakpoint 2 at 0x400fff: file /home/mikesart/data/src/blah/pthreads.cpp, line 111.</div><div>(gdb) r</div>

<div>Starting program: /home/mikesart/data/src/blah/build64/pthreads </div><div>[Thread debugging using libthread_db enabled]</div><div>Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".</div>

<div>num_threads:2</div><div>[New Thread 0x7ffff6de7700 (LWP 25890)]</div><div>'thread_0' [#0 LWP:-1 0x7ffff6de7700] pthread_setname_np('thread_0')</div><div>'thread_0' [#0 LWP:-1 0x7ffff6de7700] sleep(5)</div>

<div>'mainthrd' [#-1 LWP:-1 0x7ffff7fd4740] pthread_create:0 (Success) pthread_t:7ffff6de7700</div><div>[Switching to Thread 0x7ffff6de7700 (LWP 25890)]</div><div><br></div><div>Breakpoint 1, thread_proc (arg=0x0) at /home/mikesart/data/src/blah/pthreads.cpp:81</div>

<div>81          sleep(5);</div><div>(gdb) n</div><div>[New Thread 0x7ffff65e6700 (LWP 25964)]</div><div>'mainthrd' [#-1 LWP:-1 0x7ffff7fd4740] pthread_create:0 (Success) pthread_t:7ffff65e6700</div><div>'thread_1' [#1 LWP:-1 0x7ffff65e6700] pthread_setname_np('thread_1')</div>

<div>'thread_1' [#1 LWP:-1 0x7ffff65e6700] sleep(5)</div><div>[Switching to Thread 0x7ffff7fd4740 (LWP 25887)]</div><div><br></div><div>Breakpoint 2, main (argc=1, argv=0x7fffffffd678) at /home/mikesart/data/src/blah/pthreads.cpp:111</div>

<div>111         sleep(1);</div><div>(gdb) n</div><div>[Switching to Thread 0x7ffff65e6700 (LWP 25964)]</div><div><br></div><div>Breakpoint 1, thread_proc (arg=0x1) at /home/mikesart/data/src/blah/pthreads.cpp:81</div><div>

81          sleep(5);</div></div></div>