kag*_*san 2 c qt multithreading gdb ipc
在05:00 AM肮脏的黑客.我犯了错误,通过使用FIFO在相同进程的线程之间传递指针的地址:
total_buf = (char*)malloc(msize);
// ...
long addr = (long)&total_buf;
// ...
write(fifo, buf, 128);
Run Code Online (Sandbox Code Playgroud)
在接收器线程中接收到指向total_buf的指针后,void* pt = (void*)addr;char* tbuf = (char*)pt;我注意到缓冲区内容发生了变化,这通过检查内存内容得到了明确的证实:(gdb) x/1024xb tbuf.
造成这种情况的可能原因是什么 - 在多线程Qt +纯pthreads应用程序的插件尝试直接通信的环境中?出于某种原因,我觉得这不是一些明显的垃圾收集和事后,Linux线程正在使用共享进程内存,所以它没有地址不匹配,并且指针取消引用也看起来不错.
我在这里猜你应该试试:
long addr = (long)total_buf; /* removed & */
Run Code Online (Sandbox Code Playgroud)
...因为你后来首先将addr转换为void*然后转换为char*.你的版本有addr是指向指针的长版本,而不是指向缓冲区的指针的长版本.