mambo icon indicating copy to clipboard operation
mambo copied to clipboard

cannot stop main thread when running on android

Open whcjb opened this issue 5 years ago • 8 comments

hello, sorry to disturb. i use the dbm to run multi-threads app on android, but when the created threads exit, the main thread hanged on a basic_block loop all the time,. Then i use strace to see the syscall, found that the main thread last syscall_no is 98, which is futex, so, how to solve the problem, need your help, thanks.

whcjb avatar Sep 06 '19 02:09 whcjb

Hi,

That sounds like an issue specific to your application. Any chance you could share the executable with us so we can debug it?

Thanks

lgeek avatar Sep 09 '19 15:09 lgeek

hi,lgeek. it's not the application's error. the application runs well on android or linux. but it will hang when use dbm mt on android. it runs well on arm-linux using dbm mt, mt is the executable file name.

The application code is simple, just create two threads and use pthread_join to wait. the code here.

#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
void print_message_func(void *ptr);

int main()
{
int tmp1,tmp2;
void *retival;
pthread_t thread1;
pthread_t thread2;
char *message1 = "thread1";
char *message2 = "thread2";

int ret_thread1,ret_thread2;
ret_thread1 = pthread_create(&thread1,NULL,(void *)&print_message_func,(void *)message1);
ret_thread2 = pthread_create(&thread2,NULL,(void *)&print_message_func,(void *)message2);
tmp1 = pthread_join(thread1,&retival);
tmp2 = pthread_join(thread2,&retival);
}

void print_message_func(void *ptr)
{
    int i;
    sleep(10);
}

i use cross-compile gcc aaarch64-linux-android-gcc -o mt mt.c to compile the multi-threads appication mt.c, the ndk version is 20. after several days' error location, i have found that when use strace to ngrab the syscalls strace -f dbm mt on an android shell terminal, the error section of the log is this

---------------------------------------------------------android-strace partion [pid 4995] munmap(0x7bfd5b0000, 16777216) = 0 [pid 4995] munmap(0x7bfd429000, 1601536) = 0 [pid 4995] munmap(0x7bfe5b0000, 26034176) = 0 [pid 4995] sigaltstack({ss_sp=NULL, ss_flags=SS_DISABLE, ss_size=0}, NULL) = 0 [pid 4995] munmap(0x7c00ded000, 20480) = 0 [pid 4995] set_tid_address(0) = 4995 [pid 4995] rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1 RT_2 RT_3], ~[KILL STOP RT_1 RT_2 RT_3 RT_4 RT_5], 8) = 0 [pid 4995] munmap(0x7c00df2000, 20480) = 0 [pid 4995] munmap(0x7c00df7000, 28672) = 0 [pid 4995] exit(0) = ? [pid 4995] +++ exited with 0 +++ mmap(NULL, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x7c00df7000 mprotect(0x7c00df7000, 4096, PROT_NONE) = 0 prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x7c00df7000, 4096, "thread stack guard") = 0 mmap(NULL, 20480, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7c00df2000 prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x7c00df2000, 20480, "bionic TLS guard") = 0 mprotect(0x7c00df3000, 12288, PROT_READ|PROT_WRITE) = 0 prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x7c00df3000, 12288, "bionic TLS") = 0 clone(./strace: Process 4996 attached <unfinished ...> [pid 4996] futex(0x7c00dfd570, FUTEX_WAIT_BITSET_PRIVATE, 2, NULL, FUTEX_BITSET_MATCH_ANY <unfinished ...> [pid 4993] <... clone resumed> child_stack=0x7c00dfd4e0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7c00dfd500, tls=0x7c00dfd588, child_tidptr=0x7c00dfd500) = 4996 [pid 4993] sched_getscheduler(0) = 0 (SCHED_OTHER) [pid 4993] futex(0x7c00dfd570, FUTEX_WAKE_PRIVATE, 1) = 1 [pid 4996] <... futex resumed> ) = 0 [pid 4996] mmap(NULL, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7c00ded000 [pid 4996] mprotect(0x7c00ded000, 4096, PROT_NONE) = 0 [pid 4996] sigaltstack({ss_sp=0x7c00dee000, ss_flags=0, ss_size=16384}, NULL) = 0 [pid 4996] prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x7c00dee000, 16384, "thread signal stack") = 0 [pid 4996] prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x7c00ded000, 4096, "thread signal stack guard") = 0 [pid 4996] gettid() = 4996 [pid 4996] set_tid_address(0x7bfd424d60) = 4996 [pid 4996] futex(0xa8099640, FUTEX_WAIT_BITSET_PRIVATE, 16386, NULL, FUTEX_BITSET_MATCH_ANY <unfinished ...> [pid 4993] <... write resumed> ) = 53 [pid 4993] futex(0xa8099640, FUTEX_WAKE_PRIVATE, 1) = 1 [pid 4996] <... futex resumed> ) = 0 [pid 4993] write(1, "syscall pre syscall number: 98 "..., 56 <unfinished ...> [pid 4996] futex(0xa8099640, FUTEX_WAIT_BITSET_PRIVATE, 16386, NULL, FUTEX_BITSET_MATCH_ANYsyscall pre syscall number: 98 thread_data: 0x31a5000 <unfinished ...> [pid 4993] <... write resumed> ) = 56 [pid 4993] futex(0xa8099640, FUTEX_WAKE_PRIVATE, 1) = 1 [pid 4996] <... futex resumed> ) = 0 [pid 4993] futex(0x7bfd424dd8, FUTEX_WAKE_PRIVATE, 1) = 0 [pid 4993] futex(0xa8099640, FUTEX_WAIT_BITSET_PRIVATE, 16386, NULL, FUTEX_BITSET_MATCH_ANY <unfinished ...> [pid 4996] <... write resumed> ) = 57 [pid 4996] futex(0xa8099640, FUTEX_WAKE_PRIVATE, 1) = 0 [pid 4996] futex(0x7bfd424dd8, FUTEX_WAIT_BITSET_PRIVATE, 2, NULL, FUTEX_BITSET_MATCH_ANY) = -1 EAGAIN (Try again) [pid 4993] <... futex resumed> ) = -1 EAGAIN (Try again) [pid 4993] futex(0xa8099640, FUTEX_WAIT_BITSET_PRIVATE, 16386, NULL, FUTEX_BITSET_MATCH_ANY <unfinished ...> [pid 4996] futex(0xa8099640, FUTEX_WAKE_PRIVATE, 1 <unfinished ...> [pid 4993] <... futex resumed> ) = 0 [pid 4996] <... futex resumed> ) = 1 [pid 4996] mmap(NULL, 36864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7c00dc4000 [pid 4996] futex(0xa8099640, FUTEX_WAIT_BITSET_PRIVATE, 16386, NULL, FUTEX_BITSET_MATCH_ANYsyscall pre syscall number: 98 thread_data: 0x31a5000 <unfinished ...> [pid 4993] <... write resumed> ) = 56 [pid 4993] futex(0xa8099640, FUTEX_WAKE_PRIVATE, 1) = 1 [pid 4996] <... futex resumed> ) = 0 [pid 4993] futex(0x7bfff7cd60, FUTEX_WAIT, 4995, NULL <unfinished ...> [pid 4996] futex(0xa8099640, FUTEX_WAKE_PRIVATE, 1) = 0 [pid 4996] mprotect(0x7c00dc4000, 4096, PROT_NONE) = 0 [pid 4996] sigaltstack({ss_sp=0x7c00dc5000, ss_flags=0, ss_size=32768}, NULL) = 0 [pid 4996] prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x7c00dc5000, 32768, "thread signal stack") = 0 [pid 4996] mmap(NULL, 16777216, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7bfee84000 [pid 4996] mprotect(0x7bff8bc000, 8192, PROT_READ|PROT_WRITE) = 0 [pid 4996] sigaltstack({ss_sp=NULL, ss_flags=SS_DISABLE, ss_size=0}, NULL) = 0 [pid 4996] munmap(0x7c00dc4000, 36864) = 0 [pid 4996] rt_sigprocmask(SIG_BLOCK, ~[RT_1 RT_2 RT_3 RT_4 RT_5], [RTMIN], 8) = 0 [pid 4996] munmap(0x7bfee84000, 16777216) = 0 [pid 4996] write(1, "Exit*** thread exit, thread_data"..., 44Exit*** thread exit, thread_data 0xfba58000 ) = 44 [pid 4996] munmap(0x7bfaa58000, 16777216) = 0 [pid 4996] munmap(0x7bfa8d1000, 1601536) = 0 [pid 4996] munmap(0x7bfba58000, 26034176) = 0 [pid 4996] sigaltstack({ss_sp=NULL, ss_flags=SS_DISABLE, ss_size=0}, NULL) = 0 [pid 4996] munmap(0x7c00ded000, 20480) = 0 [pid 4996] set_tid_address(0) = 4996 [pid 4996] rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1 RT_2 RT_3], ~[KILL STOP RT_1 RT_2 RT_3 RT_4 RT_5], 8) = 0 [pid 4996] munmap(0x7c00df2000, 20480) = 0 [pid 4996] munmap(0x7c00df7000, 28672) = 0 [pid 4996] exit(0) = ? [pid 4996] +++ exited with 0 +++ ---------------------------------------------------------------------------android-strace-partion

from the log, i found that when the tid 4995 exit, the thread 4993 give a syscall [pid 4993] futex(0x7bfff7cd60, FUTEX_WAIT, 4995, NULL <unfinished ...> and it's the last record of pid 4993, so i guess the tid 4993 isn's noticed when 4995 exiting, the 4993 pending all the time.

the same application compiled runing in arm-linux is well with no error, dbm mt, the syscall strace is like this.

------------------------------------------------------------------------------------------arm-linux-strace [pid 24801] futex(0xffff963312c0, FUTEX_WAIT, 24803, NULL <unfinished ...> [pid 24803] madvise(0xffff95b31000, 8253440, MADV_DONTNEED) = 0 [pid 24803] write(1, "Exit*** thread exit\n", 20Exit*** thread exit ) = 20 [pid 24803] munmap(0xffff928b5000, 16777216) = 0 [pid 24803] munmap(0xffff940d6000, 1601536) = 0 [pid 24803] munmap(0xffff9425d000, 26034176) = 0 [pid 24803] exit(0) = ? -----------------------------------------------------------------------------------------------arm-linux-strace

sorry that the binary file can't be uploaded, but you can compile the .c file, it;s the same. i have no idea how to debug next, it's good on arm-linux, but the error above on android. Thanks a lot.

whcjb avatar Sep 11 '19 06:09 whcjb

it is the same error when run dbm geekbench_aarch64, the strace is the same that the main thread wait for the first child thread to exit which has already exited. the test is on android.

whcjb avatar Sep 11 '19 07:09 whcjb

i tested that the dbm runs well when comment the line tmp1 = pthread_join(thread1,&retival);


prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x76cba7d000, 12288, "bionic TLS") = 0 clone(child_stack=0x76cba874e0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x76cba87500, tls=0x76cba87588, child_tidptr=0x76cba87500) = 13932 ./strace: Process 13932 attached [pid 13931] sched_getscheduler(0 <unfinished ...> [pid 13932] futex(0x76cba87570, FUTEX_WAIT_BITSET_PRIVATE, 2, NULL, FUTEX_BITSET_MATCH_ANY <unfinished ...> [pid 13931] <... sched_getscheduler resumed> ) = 0 (SCHED_OTHER) [pid 13931] futex(0x76cba87570, FUTEX_WAKE_PRIVATE, 1 <unfinished ...> [pid 13932] <... futex resumed> ) = -1 EAGAIN (Try again) [pid 13932] mmap(NULL, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x76cba77000 [pid 13932] mprotect(0x76cba77000, 4096, PROT_NONE) = 0 [pid 13932] sigaltstack({ss_sp=0x76cba78000, ss_flags=0, ss_size=16384}, NULL) = 0 [pid 13932] prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x76cba78000, 16384, "thread signal stack" <unfinished ...> [pid 13931] <... futex resumed> ) = 0 [pid 13932] <... prctl resumed> ) = 0 [pid 13932] prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x76cba77000, 4096, "thread signal stack guard") = 0 [pid 13932] gettid() = 13932 [pid 13932] set_tid_address(0x76cac3fd60) = 13932 [pid 13932] futex(0x76cac3fdd8, FUTEX_WAIT_BITSET_PRIVATE, 2, NULL, FUTEX_BITSET_MATCH_ANY <unfinished ...> [pid 13931] futex(0x76cac3fdd8, FUTEX_WAKE_PRIVATE, 1 <unfinished ...> [pid 13932] <... futex resumed> ) = -1 EAGAIN (Try again) [pid 13931] <... futex resumed> ) = 0 [pid 13932] mmap(NULL, 36864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0 <unfinished ...> [pid 13931] mmap(NULL, 1036288, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0 <unfinished ...> [pid 13932] <... mmap resumed> ) = 0x76cba6e000 [pid 13932] mprotect(0x76cba6e000, 4096, PROT_NONE) = 0 [pid 13932] sigaltstack({ss_sp=0x76cba6f000, ss_flags=0, ss_size=32768}, NULL) = 0 [pid 13932] prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x76cba6f000, 32768, "thread signal stack" <unfinished ...> [pid 13931] <... mmap resumed> ) = 0x76c7fef000 [pid 13931] mprotect(0x76c7ff0000, 1028096, PROT_READ|PROT_WRITE) = 0 [pid 13931] rt_sigprocmask(SIG_BLOCK, ~[RT_1 RT_2 RT_3 RT_4 RT_5], [RTMIN], 8) = 0 [pid 13931] rt_sigprocmask(SIG_SETMASK, [RTMIN], NULL, 8) = 0 [pid 13932] <... prctl resumed> ) = 0 [pid 13931] mmap(NULL, 26033312, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0 <unfinished ...> [pid 13932] mmap(NULL, 16777216, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0 <unfinished ...> [pid 13931] <... mmap resumed> ) = 0x76c671b000 [pid 13932] <... mmap resumed> ) = 0x76c571b000 [pid 13931] mmap(NULL, 16777216, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x76c471b000 [pid 13932] mprotect(0x76c5d44000, 8192, PROT_READ|PROT_WRITE) = 0 [pid 13931] mmap(NULL, 1600016, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x76c4594000 [pid 13932] fstat(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 1), ...}) = 0 [pid 13932] mmap(NULL, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x76c4394000 [pid 13932] prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x76c4394000, 2097152, "libc_malloc") = 0 [pid 13932] munmap(0x76c4394000, 2097152) = 0 [pid 13932] mmap(NULL, 4190208, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x76c4195000 [pid 13932] prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x76c4195000, 4190208, "libc_malloc") = 0 [pid 13932] munmap(0x76c4195000, 438272) = 0 [pid 13932] munmap(0x76c4400000, 1654784) = 0 [pid 13932] mprotect(0x76c4200000, 4096, PROT_NONE) = 0 [pid 13932] mmap(NULL, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x76c4000000 [pid 13932] prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x76c4000000, 2097152, "libc_malloc") = 0 [pid 13932] ioctl(1, TCGETS, {B38400 opost isig icanon echo ...}) = 0 [pid 13932] write(1, "sleep..........................."..., 64sleep.......................................................... ) = 64 [pid 13932] nanosleep({tv_sec=10, tv_nsec=0}, <unfinished ...> [pid 13931] mmap(NULL, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x76cba67000 [pid 13931] mprotect(0x76cba67000, 4096, PROT_NONE) = 0 [pid 13931] prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x76cba67000, 4096, "thread stack guard") = 0 [pid 13931] mmap(NULL, 20480, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x76cba62000 [pid 13931] prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x76cba62000, 20480, "bionic TLS guard") = 0 [pid 13931] mprotect(0x76cba63000, 12288, PROT_READ|PROT_WRITE) = 0 [pid 13931] prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x76cba63000, 12288, "bionic TLS") = 0 [pid 13931] clone(child_stack=0x76cba6d4e0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x76cba6d500, tls=0x76cba6d588, child_tidptr=0x76cba6d500) = 13933 ./strace: Process 13933 attached [pid 13931] sched_getscheduler(0) = 0 (SCHED_OTHER) [pid 13933] mmap(NULL, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x76cba5d000 [pid 13933] mprotect(0x76cba5d000, 4096, PROT_NONE) = 0 [pid 13933] sigaltstack({ss_sp=0x76cba5e000, ss_flags=0, ss_size=16384}, NULL) = 0 [pid 13933] prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x76cba5e000, 16384, "thread signal stack") = 0 [pid 13933] prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x76cba5d000, 4096, "thread signal stack guard") = 0 [pid 13933] gettid() = 13933 [pid 13933] set_tid_address(0x76c80e7d60) = 13933 [pid 13933] mmap(NULL, 36864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0 <unfinished ...> [pid 13931] mprotect(0x76cfc26000, 4096, PROT_READ|PROT_WRITE <unfinished ...> [pid 13933] <... mmap resumed> ) = 0x76cba54000 [pid 13931] <... mprotect resumed> ) = 0 [pid 13931] mprotect(0x76cfc26000, 4096, PROT_READ <unfinished ...> [pid 13933] mprotect(0x76cba54000, 4096, PROT_NONE <unfinished ...> [pid 13931] <... mprotect resumed> ) = 0 [pid 13933] <... mprotect resumed> ) = 0 [pid 13931] mprotect(0x76cfc26000, 4096, PROT_READ|PROT_WRITE <unfinished ...> [pid 13933] sigaltstack({ss_sp=0x76cba55000, ss_flags=0, ss_size=32768}, <unfinished ...> [pid 13931] <... mprotect resumed> ) = 0 [pid 13933] <... sigaltstack resumed> NULL) = 0 [pid 13931] mprotect(0x76cfc26000, 4096, PROT_READ <unfinished ...> [pid 13933] prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x76cba55000, 32768, "thread signal stack" <unfinished ...> [pid 13931] <... mprotect resumed> ) = 0 [pid 13933] <... prctl resumed> ) = 0 [pid 13933] mmap(NULL, 16777216, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x76c3000000 [pid 13931] munmap(0x76cfc26000, 4096 <unfinished ...> [pid 13933] mprotect(0x76c36d4000, 8192, PROT_READ|PROT_WRITE) = 0 [pid 13933] write(1, "sleep..........................."..., 64 <unfinished ...> sleep.......................................................... [pid 13931] <... munmap resumed> ) = 0 [pid 13933] <... write resumed> ) = 64 [pid 13931] write(2, "We're done; exiting with status:"..., 35 <unfinished ...> We're done; exiting with status: 0 [pid 13933] nanosleep({tv_sec=10, tv_nsec=0}, <unfinished ...> [pid 13931] <... write resumed> ) = 35 [pid 13931] mprotect(0x76cfdc5000, 4096, PROT_READ|PROT_WRITE) = 0 [pid 13931] mprotect(0x76cfdc5000, 4096, PROT_READ) = 0 [pid 13931] munmap(0x76cfdc5000, 4096) = 0 [pid 13931] exit_group(0) = ? [pid 13933] <... nanosleep resumed> <unfinished ...>) = ? [pid 13932] <... nanosleep resumed> <unfinished ...>) = ? [pid 13933] +++ exited with 0 +++ [pid 13932] +++ exited with 0 +++ +++ exited with 0 +++


so the error come from the futex(wait), or the inconnection between the futex(wake) and futex(wait). please help.

whcjb avatar Sep 11 '19 09:09 whcjb

@whcjb @lgeek I have the same issue. After some investigation, I think the problem may be at this line, we can't join a thread if it is not attachable?

amimo avatar Nov 12 '19 12:11 amimo

Thanks both of you. @amimo that makes sense, but nevertheless I can't reproduce the behavior described here on GNU/Linux. I suspect it's a difference in Android's pthreads implementation compared to glibc, I'll take a closer look.

lgeek avatar Nov 12 '19 15:11 lgeek

Since MAMBO is linked statically, it will be using the standard library of the system it's compiled on, not of the host machine. This zip archive contains the master head I've built on an Arch Linux ARM system. This executable is running the example provided by @whcjb (also compiled on Arch and linked statically) correctly on an Android device.

It would be useful to know if this MAMBO binary can run @whcjb's example compiled with the Android toolchain without hanging.

lgeek avatar Nov 12 '19 16:11 lgeek

It would be useful to know if this MAMBO binary can run @whcjb's example compiled with the Android toolchain without hanging.

This MAMBO built can exit normally running @whcjb's example compiled with the Android toolchain.

amimo avatar Nov 13 '19 01:11 amimo

Since it's an old issue and I have no way of testing it at the moment, I'm going to close it in the effort to clean up the repo. If anyone still requires this fix, please re-open the issue and I can look into it.

IgWod avatar Feb 07 '24 16:02 IgWod