<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/107322>107322</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Abnormal Behavior of LLDB Thread Control
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
edumoot
</td>
</tr>
</table>
<pre>
After setting a breakpoint at line 22, which is the start of the for loop, and running the process, using a few step-over or step-into commands (n or s) causes LLDB to skip to the main function and then exit. The test case comes from #107317.
Comparing the bugs that reported at #104531, the LLDB's behaviors are different.
In LLVM18.06, 17.06, 16.0.3, we can reproduce it:
```
clang -g -O3 -o 420_O3.out 420.c
lldb 420_O3.out
(lldb) b 22
(lldb) r
* thread #1, name = '420_O3.out', stop reason = breakpoint 1.1
frame #0: 0x000055555555518c 420_O3.out`main [inlined] func_1 at 420.c:22
19 int *local_var_ptr = &global_var;
20 (*global_ptr_ref) = local_var_ptr;
21
-> 22 for (global_var = 4; global_var != 9; ++global_var)
23 {
24 unsigned char shift_val = 254;
25 global_flag++;
(lldb) n
Process 135441 stopped
* thread #1, name = '420_O3.out', stop reason = step over
frame #0: 0x0000555555555196 420_O3.out`main at 420.c:34:5
31 int main (void)
32 {
33 func_1();
-> 34 return 0;
35 }
36
37 /************************ statistics *************************
(lldb) n
Process 135441 stopped
* thread #1, name = '420_O3.out', stop reason = step over
frame #0: 0x00007ffff7db8d90 libc.so.6`___lldb_unnamed_symbol3139 + 128
libc.so.6`___lldb_unnamed_symbol3139:
-> 0x7ffff7db8d90 <+128>: movl %eax, %edi
0x7ffff7db8d92 <+130>: callq 0x7ffff7dd45f0 ; exit
0x7ffff7db8d97 <+135>: callq 0x7ffff7e20670 ; ___lldb_unnamed_symbol3467
0x7ffff7db8d9c <+140>: lock
(lldb) r
[...]
* thread #1, name = '420_O3.out', stop reason = breakpoint 1.1
frame #0: 0x000055555555518c 420_O3.out`main [inlined] func_1 at 420.c:22
19 int *local_var_ptr = &global_var;
20 (*global_ptr_ref) = local_var_ptr;
21
-> 22 for (global_var = 4; global_var != 9; ++global_var)
23 {
24 unsigned char shift_val = 254;
25 global_flag++;
(lldb) s
Process 135451 stopped
* thread #1, name = '420_O3.out', stop reason = step in
frame #0: 0x0000555555555196 420_O3.out`main at 420.c:34:5
31 int main (void)
32 {
33 func_1();
-> 34 return 0;
35 }
36
37 /************************ statistics *************************
(lldb) s
Process 135451 stopped
* thread #1, name = '420_O3.out', stop reason = step in
frame #0: 0x00007ffff7db8d90 libc.so.6`___lldb_unnamed_symbol3139 + 128
libc.so.6`___lldb_unnamed_symbol3139:
-> 0x7ffff7db8d90 <+128>: movl %eax, %edi
0x7ffff7db8d92 <+130>: callq 0x7ffff7dd45f0 ; exit
0x7ffff7db8d97 <+135>: callq 0x7ffff7e20670 ; ___lldb_unnamed_symbol3467
0x7ffff7db8d9c <+140>: lock
```
`cat 420.c`
```
union U1 {
short short_val;
volatile int int_val;
unsigned int uint_val;
short another_short;
volatile int another_int;
};
static int global_var = 0x1C0F8067;
static int *global_ptr = &global_var;
static int **volatile global_ptr_ref = &global_ptr;
static int global_counter = 0x95751CF;
static volatile unsigned char global_flag = 9;
static unsigned int global_shift = 0;
static union U1 global_union = {-4};
static union U1 func_1(void)
{
int *local_var_ptr = &global_var;
(*global_ptr_ref) = local_var_ptr;
for (global_var = 4; global_var != 9; ++global_var)
{
unsigned char shift_val = 254;
global_flag++;
global_shift |= (0xF1BB << (*local_var_ptr)) | ((shift_val << 15) * ((*local_var_ptr << global_flag) >= (*global_ptr)));
}
return global_union;
}
int main (void)
{
func_1();
return 0;
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWEuP2zgS_jX0pWCBIvU8-OBHDCzQi-whu1eDkiiLG5n0kpTT-fcLUg9L_ZjpBB1Mz2AMQRaL9WJVsT5KzBhxlpxvULxD8WHFOtsoveFVd1HKrgpVfd9sa8s1GG6tkGdgUGjOvl6VkBaYhVZIDoQgsodvjSgbEAZsw8FYpi2o2g9qpaFV6uq4mKxAd1I6ZW7uqlXJjXFTnekt1PwbGMuva3XjGpTuB0JaBaW6XJisDCCSST-FSA4l6ww38PBw2IFVYL6Kq_t36i9MSKg7WVqhpDduGy6BPwobwJeGg-XGQskMd7q5gVqrCyBCQ5zSMA0QPiC87e97dbkyPTpedGe3VGZB86vSllcuHl4yimnoFuTYnFOIpAYK3rCbUNoA0xwqUddcc2kXFvr7PyQ8PPznn2EW4MSpCdPxIQlwQH2sOZRMOstaVV3JQVhERyUJHi4_LFsmz7A-w_ozhbWCiODTZxqozrrHoOy52rYqZlMLp0jmZl2gC5fqp0Q9UrZgG81Z5YPgvJTswgHRAyCSznST1E0aq66gOTNKep5ZXYVB2OsEAKi110IoRnQL-BFjjOPxF2bl3OsE-3yjeCekq8wKxQef_VPoktOvl27HRQBAmAMgnIMzi8i2VSVrTzemT1erB9eTc6uKnorobpIkuJcEcMWIyHZgu1p90rx2kXHyC40L-fAu72lrRD8BIRPV7RpEsrt1ry9CdAdzGgkdOXdkRHaI7Gbukvxujt7NpTMvoonsfp30DaGCsmEaTCNqe7qx1lsmcbTwP15IDlbrlp17NybeWanInvKvfs9DSOMoCn0lXHn1PmXkegW4xvHWCsqTFypoViw0QnQbT9ponzZXL32tkeymRDUPNe1zOA8zHaLf16Kvl3wKkE88vSdCc9tpCXgebRoPOg93UtKTpnHqh-SIyPZdLtfErTBWlK7fvo9Od33cqkjruq7TqsiqHEMrijIwKkhQgk-nk_P21ElntjqZ75dCtTSkudt0EJJsaKNvkplatc884MeFXUT3iOycSvrJuXZRt9Y3mZizR7c491SJ-0oW8mSUd-vy8iVr2__NuKoorp2VnUfBV9Skk5r4ZTWc4CTFMPs5ja-sOUrSV-yUo51odLdV5Vd4DoovAE68C4IAxYe_Av4A_IEQ9Ovx55ehz5tgxzxvMPGvaDBCfkjQcd78HO68DXX-pLDzUarib9D5iKCzfImaiOW0SaepJWcn3Yvmv8NFnwPTKG37u-to804GN9UyK1ruAUDI5wxTW3QM3TOOXjeTyjZcn_zodf0jm5B3Jre9p2d_9zuw9AJP2j9-DPf4mOEknURmzAsI-g3sWoogsp18XCLYExVz-HruYqk6afnoZh6ncbg_PuWfDC2xZgYjMMLZQm6Rg4HbA1Rv7jn7UAUDaz_2q0l36-jViE9yU8Ne9PlFTf34eeHnTgkwa1_v-kq63CI_eAD4nZfOJxxDqtJ9H58MPx7D3c63AbofwrIMAMl9YNJhNps744XC2DOQ7cDwQio838JHF-pPgw-LTPT25ujcB-gOvCM8zytqsYVn1fTqQWER8RcPBS8eBO7qx2a3qja0ymnOVnwTpiSOsjyM01WzyQmPMlKUtKY4L3nGohRXIaMpL8OkotlKbAgmEc5xRAglNA1SkiQkzzKaJxkO4wJFmF-YaIO2vV0Cpc8rYUzHNyFOKSGrlhW8Nf6LJSGSfwM_iwhB8WGlN05oXXRngyLcCmPNXY0VtuWbbSGVvrAWdsMHOVB1_-nwS4_0eyWtVu2q0-2msfZqHHK6483xLGzTFUGpLogcndrhb33V6r-8tIgcvTMGkePg7W1D_h8AAP__zoLbfA">