微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

gdbserver 在使用 pthread 或任何链接 libpthread.so

如何解决gdbserver 在使用 pthread 或任何链接 libpthread.so

如果我在 WSL 中首次使用 continue 之前尝试使用 gdbserver 并在任何地方设置任何断点,则在使用 gdbserver 启动程序后失败:无法获取 LWP ### 的线程句柄:通用错误

如果我尝试先启动程序,gdbserver 会忽略来自 gdb 的所有命令,只有在程序完成后,才开始处理所有写入 gdb 的命令。

作品: ldd ./test
linux-vdso.so.1 (0x00007ffff7063000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4b608d0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4b61000000)

不会: ldd ./test
linux-vdso.so.1 (0x00007fffd0105000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f443aff0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f443abf0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f443b600000)

cc --version
cc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0

构建:
cc -o test ./src/main.c -pthread

代码 (c) www.geeksforgeeks.org

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>  //Header file for sleep(). man 3 sleep for details.
#include <pthread.h>

// A normal C function that is executed as a thread
// when its name is specified in pthread_create()
void *myThreadFun(void *vargp)
{
    (void)vargp;
    sleep(1);
    printf("Printing GeeksQuiz from Thread \n");
    return NULL;
}

int main()
{
    pthread_t thread_id;
    printf("Before Thread\n");
    pthread_create(&thread_id,NULL,myThreadFun,NULL);
    pthread_join(thread_id,NULL);
    printf("After Thread\n");
    exit(0);
}

gdbserver
LD_PRELOAD=/lib/x86_64-linux-gnu/libpthread.so.0 gdbserver :54321 ./test
要么 gdbserver :54321 ./test

进程 ./test 创建; pid = 11088
监听 54321 端口
从主机 127.0.0.1 远程调试
gdbserver:无法获取 LWP 11088 的线程句柄:一般错误
监听 54321 端口
已终止

gdb
echo target remote 127.0.0.1:54321 > /tmp/test_.gdbinit
gdb -x /tmp/test_.gdbinit
GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1
版权所有 (C) 2018 Free Software Foundation,Inc.
许可证 GPLv3+:GNU GPL 版本 3 或更高版本http://gnu.org/licenses/gpl.html
这是免费软件:您可以自由更改和重新分发它。
在法律允许的范围内,不提供任何保证。输入“显示复制”
和“显示保修”了解详情。
此 GDB 被配置为“x86_64-linux-gnu”。
输入“显示配置”以获取配置详细信息。
有关错误报告的说明,请参阅:
http://www.gnu.org/software/gdb/bugs/
在线查找 GDB 手册和其他文档资源:
http://www.gnu.org/software/gdb/documentation/
如需帮助,请输入“帮助”。
输入“apropos word”搜索与“word”相关的命令。
从远程目标读取 /home/mtunder/workspace/portfolio/test/test...
警告:从远程目标传输文件可能很慢。改用“set sysroot”在本地访问文件
从远程目标读取 /home/mtunder/workspace/portfolio/test/test...
从目标读取符号:/home/mtunder/workspace/portfolio/test/test...(未找到调试符号)...完成。
从远程目标读取 /lib64/ld-linux-x86-64.so.2...
从远程目标读取 /lib64/ld-linux-x86-64.so.2...
从远程目标读取 /lib64/ld-2.27.so...
从远程目标读取 /lib64/.debug/ld-2.27.so...
0x00007fffff401090 在 ?? () 来自目标:/lib64/ld-linux-x86-64.so.2
(gdb) b main
断点 1 在 0x80007c7
(gdb) c
继续。
从远程目标读取 /lib/x86_64-linux-gnu/libpthread.so.0...
从远程目标读取 /lib/x86_64-linux-gnu/libc.so.6...
从远程目标读取 /lib/x86_64-linux-gnu/libc-2.27.so...
从远程目标读取 /lib/x86_64-linux-gnu/.debug/libc-2.27.so...
(gdb) CTRL+Z
[1]+ 停止

一些 dkpg 输出
|?|名称|版本|架构|说明|
|-|----|-------|------------|-----------|

dpkg -l *thread*
un libthread-queue-perl(无描述)
un libthreads-perl(没有可用的描述)
un libthreads-shared-perl(无描述)

dpkg -l *gdb*
ii gdb 8.1.1-0ubuntu1 amd64 GNU 调试器
un gdb-doc(无描述)
ii gdb-multiarch 8.1.1-0ubuntu1 amd64 GNU 调试器(支持多种架构)
un gdbm-l10n(无可用描述)
ii gdbserver 8.1.1-0ubuntu1 amd64 GNU 调试器(远程服务器)
ii libgdbm-compat4:amd64 1.14.1-6 amd64 GNU dbm 数据库例程(遗留支持运行时版本
ii libgdbm5:amd64 1.14.1-6 amd64 GNU dbm 数据库例程(运行时版本)
ii python3-gdbm:amd64 3.6.9-1~18.04 amd64 GNU dbm 数据库支持 Python 3.x
un python3-gdbm-dbg(无描述)
un python3.6-gdbm(无描述)
un python3.7-gdbm(无描述)
un python3.8-gdbm(无描述)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。