我做错了什么(或没有做错)gdb
对我不起作用?
root@6be3d60ab7c6:/# cat minimal.c
int main()
{
int i = 1337;
return 0;
}
root@6be3d60ab7c6:/# gcc -g minimal.c -o minimal
root@6be3d60ab7c6:/# gdb minimal
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
.
.
.
Reading symbols from minimal...done.
(gdb) break main
Breakpoint 1 at 0x4004f1: file minimal.c, line 3.
(gdb) run
Starting program: /minimal
warning: Error disabling address space randomization: Operation not permitted
During startup program exited normally.
(gdb)
(gdb) print i
No symbol "i" in current context.
答案 0 :(得分:90)
如果你正在使用Docker,你可能需要--security-opt seccomp=unconfined
选项(以及启用ptrace):
docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined
答案 1 :(得分:14)
无论出于何种原因,您的用户帐户无权禁用此进程的内核地址空间布局随机化。默认情况下,gdb将其关闭,因为它使某些调试更容易(特别是,这意味着每次运行程序时堆栈对象的地址都是相同的)。阅读更多here。
您可以通过使用set disable-randomization off
禁用gdb的此功能来解决此问题。
至于让您的用户获得禁用ASLR所需的权限,它可能归结为拥有/proc/sys/kernel/randomize_va_space
的写入权限。阅读更多here。
答案 2 :(得分:6)
以wisbucky's answer为基础(谢谢!),以下是Docker compose的相同设置:
security_opt:
- seccomp:unconfined
cap_add:
- SYS_PTRACE
安全选项seccomp:unconfirmed
修复了address space randomization
警告。
即使Docker documentation指出SYS_PTRACE是“默认情况下未授予”的功能,功能SYS_PTRACE似乎也没有明显的作用。也许我不知道要寻找什么。