如何解决在gdb中正在运行的程序中查看环境变量
在核心转储文件中,我可以使用以下命令查看环境变量:
$ gdb file core
>>> p __environ[0]
$1 = 0x7ffe6420dcbd "SHELL=/bin/bash"
>>> p __environ[1]
$2 = 0x7ffe6420dccd "TMUX=/tmp/tmux-1001/default,13871,0"
# basically the same as doing $ printenv
但是,当我尝试调试普通的可执行文件时:
# file.s
.globl main
main:
ret
$ gcc file.s -ggdb3 -o file2
$ gdb -q file2
Reading symbols from file...
(No debugging symbols found in file)
>>> starti
>>> p __environ
No symbol "__environ" in current context.
如何获得对environ
和argv
的访问权限?一种可能的方法是检查其过程文件:
>>> python print(open('/proc/48011/environ').read().replace('\x00','\n'))
SHELL=/bin/bash
TMUX=/tmp/tmux-1001/default,0
SSH_AUTH_SOCK=/tmp/ssh-RtmbGp8HSFcN/agent.14219
SSH_AGENT_PID=14220
EDITOR=/usr/bin/vim
48011
来自:
─── Threads ───────────────────────────────────────────────────────────────────
[1] id 48011 name file from 0x0000000000401005 in _start
解决方法
根据its documentation,GDB有一个show environment
command。在Linux上,还请阅读gdb(1)中记录的gcore(1),core(5),proc(5),signal(7),gcc(1)和environ(7)和约定。另请参见getenv(3)和putenv(3)。您也可以玩objdump(1)和readelf(1)和nm(1)。请确保阅读更多有关ELF的文档,也许是在Linkers and loaders书中。
但是,如果您在LInux上使用gcc file.s -ggdb3 -o file2
编译一个汇编文件,则该汇编文件缺少DWARF调试信息,这几乎是GDB所需的。
因此,请尝试编写一个小型hello-world.c
程序,使用gcc -Wall -Wextra -fverbose-asm -g -S hello-world.c
进行编译,然后检查(例如,使用less(1))发出的hello-world.s
汇编文件。您会看到很多与DWARF相关的汇编器指令。再次使用gcc -v -Wall -Wextra -g -O hello-world.c -o helloworld
进行编译,以了解GCC正在为您启动什么程序。另请阅读有关invoking GCC的文档。
当然要注意crt0启动代码。在Linux上,研究GNU libc(或musl-libc)以及GCC和binutils的源代码。它们全部是free software或至少是open source软件,您可以下载,研究和改进其源代码。
另请阅读Linux ABI的规范。参见this answer。考虑还研究Linux kernel的源代码。另请参见kernelnewbies。
您可能会对linuxfromscratch.org感兴趣,它给出了详细的逐步说明(从头开始构建整个Linux发行版)。阅读Advanced Linux Programming和Linux Assembler HowTo。然后预算几个星期的工作。
还请阅读execve(2),elf(5),syscalls(2),并研究GNU bash的源代码。
阅读有关process,system call,computer files,file systems和executable的维基页面。考虑阅读一本不错的textbook on operating systems和Modern C这本书,以及C11标准n1570。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。