最简单的你 a.out 1.txt
公司主营业务:成都网站设计、做网站、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联推出霍山免费做网站回馈大家。
或者用dup2,重定向。
你首先要搞清楚控制台上的输出是怎么输出的,比如说是程序里面printf出来的, 脚本里面echo出来的等等。
然后做一个写日志的函数代码那个输出。也可以把标准输出的文件描述符dup到你要写的文件上面。
最简单的你 a.out 1.txt
或者用dup2,重定向。
函数执行,产生的标准输出,已经再控制台了,我再把它重定向。
你首先要搞清楚控制台上的输出是怎么输出的,比如说是程序里面printf出来的, 脚本里面echo出来的等等。
然后做一个写日志的函数代码那个输出。也可以把标准输出的文件描述符dup到你要写的文件上面。
execvp(args[0], args) 这个函数运行产生的结果。
使用命令重定向操作符可以使用重定向操作符将命令输入和输出数据流从默认位置重定
向到不同的位置。输入或输出数据流的位置即为句柄。
下表将列出可用的句柄。
句柄 句柄的数字代号 描述
STDIN 0 键盘输入
STDOUT 1 输出到命令提示符窗口
STDERR 2 错误输出到命令提示符窗口
UNDEFINED 3-9 这些句柄由应用程序单独定义,并且是各个工具特定的。
数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序并将该程序前 10 个
句柄中的任何一个重定向。要指定想使用的句柄,可在重定向操作符前面键入该句柄的
数字。如果未定义句柄,则默认的 重定向输入操作符是 0,而默认的 重定向输出
操作符是 1。键入 或 操作符之后,必须指定要读取或写入数据的位置。可以指定
文件名或另一个现有的句柄。
要指定重定向到现有句柄,请使用与 () 字符,后面接要重定向的句柄号
(例如 句柄#)。例如,下面的命令可以将句柄 2(即 STDERR)重定向到
句柄 1(即 STDOUT):
21
下表列出了可用于将输入和输出数据流进行重定向的操作符。
重定向操作符 描述
将命令输出写入到文件或设备(例如打印机)中,而不是写在命令提示符窗口或句柄中。
从文件中而不是从键盘或句柄中读入命令输入。
将命令输出添加到文件末尾而不删除文件中的信息。
将一个句柄的输出写入到另一个句柄的输入中。
从一个句柄读取输入并将其写入到另一个句柄输出中。
| 从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。
默认情况下,可以从键盘将命令输入(即 STDIN 句柄)发送到 Cmd.exe,然后由
Cmd.exe 将命令输出(即 STDOUT 句柄)发送到命令提示符窗口。
重定向输入 ()
要将键盘输入重定向到文件或设备,请使用 操作符。例如,要从 File.txt 获取
sort 命令的输入,请键入:
sortfile.txt
File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。
操作符可以打开具有只读访问的指定文件名。所以,不能使用该操作符向文件中写入
信息。例如,如果以 2 启动程序,则所有试图读取句柄 0 的操作都将失败,因为句
柄 2 最初是以只写访问打开的。
注意
0 是 重定向输入操作符的默认句柄。
重定向输出 ()
几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的
命令也会在命令提示符窗口显示消息和提示。
要将输出从命令提示符窗口重定向到文件或设备,请使用 操作符。可以在许多命令中
使用该操作符。例如,要将 dir 输出重定向到 Dirlist.txt,请键入:
dirdirlist.txt
如果 Dirlist.txt 不存在,Cmd.exe 将创建该文件。如果 Dirlist.txt 存在,Cmd.exe
将使用 dir 命令的输出替换文件中的信息。
要运行 netsh routing dump 命令,然后将输出发送到 Route.cfg,请键入:
netsh routing dumpc:\route.cfg
操作符可以打开具有只写访问属性的指定文件。所以,不能使用该操作符读取文件。
例如,如果使用重定向 0 启动程序,则所有试图写入句柄 1 的操作都将失败,因为
句柄 0 最初是以只读访问打开的。
注意
1 是 重定向输出操作符的默认句柄。
复制句柄
重定向操作符 可以将输出或输入从一个指定句柄复制到另一个指定的句柄。例如,
要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt,请键入:
dirc:\file.txt 21
复制句柄时,可以复制该句柄原状态的所有特性。例如,如果一个句柄具有只写访问的
属性,则该句柄的所有副本都具有只写访问属性。不能将一个具有只读访问属性的句柄
复制到另一个具有只写访问属性的句柄。
使用 操作符重定向输入和副本
要将重定向输入操作符 () 与复制操作符 () 一起使用,指定的文件必须已经存在。
如果输入文件存在,Cmd.exe 将以只读方式打开该文件,然后将文件中包含的字符作为
输入发送到此命令(如同从键盘输入一样)。如果指定了句柄,Cmd.exe 将指定的句柄
复制到系统现有的句柄中。
例如,要以句柄 0 输入读取(即 STDIN)的方式打开 File.txt,请键入:
file.txt
要打开 File.txt,并在内容排序后将输出发送到命令提示符窗口(即 STDOUT),请键入:
sortfile.txt
要查找 File.txt,然后将句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到
Search.txt,请键入:
findfile file.txtsearch.txt 21
要以句柄 0 输入读取(即 STDIN)的方式复制用户定义句柄 3,请键入:
3
使用 操作符重定向输出和复制
如果将输出重定向到文件且指定了现有的文件名,Cmd.exe 将以只写方式打开文件并覆
盖该文件内容。如果指定了句柄,Cmd.exe 将文件复制到现有句柄中。
要将用户定义句柄 3 复制到句柄 1,请键入:
3
要将包括句柄 2(即 STDERR)的所有输出从 ipconfig 命令重定向到
句柄 1(即 STDOUT),然后将输出重定向到 Output.log,请键入:
ipconfig.exeoutput.log 21
使用 重定向操作符追加输出
要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息,请使用两个连续
的大于号(即 )。例如,下面的命令可以将由 dir 命令生成的目录列表追加到
Dirlist.txt 文件:
dirdirlist.txt
要将 netstat 命令的输出追加到 Tcpinfo.txt 的末尾,请键入:
netstattcpinfo.txt
使用管道操作符 (|)
管道操作符 (|) 可以提取一个命令的输出(默认情况下是 STDOUT),然后将其导入另
一个命令的输入中(默认情况下是 STDIN)。例如,下面的命令将对目录分类:
dir | sort
在本例中,将同时启动两个命令,但随后 sort 命令会暂停,直到它接收到 dir 命令
的输出为止。sort 命令使用 dir 命令的输出作为输入,然后将输出发送到
句柄 1(即 STDOUT)。
合并带重定向操作符的命令
可以通过合并带有其他命令和文件名的筛选器命令创建自定义命令。例如,可以使用以
下命令存储包含“LOG”字符串的文件名:
dir /b | find "LOG" loglist.txt
dir 命令的输出通过 find 筛选器命令发送。包含字符串 "LOG" 的文件名作为文件名
列表(例如,NetshConfig.log、Logdat.svd 和 Mylog.bat)存储在文件
Loglist.txt 中。
要在相同命令中使用多个筛选器,请使用管道 (|) 分隔筛选器。例如,下面的命令将
搜索 C 盘上的每个目录以查找包含 "LOG" 字符串的文件名,并且在命令提示符窗口中
每次显示一屏:
dir c:\ /s /b | find "LOG" | more
利用管道 (|) 可以将 Cmd.exe 导向为通过 find 筛选器命令发送 dir 命令输出。
find 命令只选择包含字符串 "LOG" 的文件名。more 命令可以显示由 find 命令选择
的文件名(在命令提示符窗口中每次显示一屏)。有关筛选器命令的详细信息,请参阅
使用筛选器。
在弹出的对话框里输入正确的用户名(一般默认为root)和密码,则进入添加打印机页面。
1.在浏览器的地址栏输入:localhost:631.
2.则出现CUPS管理页面。
3.选择“ManagePrinterClasses”,则进入打印机类管理页面。
4.点击添加打印机类:访问这个页面需要本地的有相应权限的用户名和密码,如果你以普通用户使用浏览器,在弹出的对话框里输入正确的用户名(一般默认为root)和密码,则进入添加打印机页面。
5.页面的编辑框中输入你想设定的打印机类名字(随自己喜欢什么样的便于识别的名字),位置和描述栏可不填,点击“continue”。
应该说这是不可以的,因为系统内核有最高权限一部分内核信息需要输出到控制台,别人无法阻止它
如果你说的控制台是专指某种设备比如直接连接在主机上的显示器的话就是另外一回事了,他只是一个普通的输出设备tty, 我们可以把系统配制成在启动的时候选择其他设备(一般是串口)作为控制台,这样的情况下显示器就不是系统控制台了,你可以对它设置权限只允许某个账户进行读写,只显示你想要输出的内容,倒不是因为系统被屏蔽了无法输出而是因为他不是控制台系统根本不会试图输出任何东西过来
具体参数及讲解如下:
print命令的格式是:
print xxx
p xxx
1. print 操作符
@
是一个和数组有关的操作符,在后面会有更详细的说明。
::
指定一个在文件或是一个函数中的变量。
{}
表示一个指向内存地址的类型为type的一个对象。
2. 察看内容
全局变量(所有文件可见的)
静态全局变量(当前文件可见的)
局部变量(当前Scope可见的)
如果你的局部变量和全局变量发生冲突(也就是重名),一般情况下是局部变量会隐藏全局变量。如果此时你想查看全局变量的值时,你可以使用“::”操作符:
file::variable
function::variable
eg:
查看文件f2.c中的全局变量x的值:
gdb) p 'f2.c'::x
注:如果你的程序编译时开启了优化选项,那么在用GDB调试被优化过的程序时,可能会发生某些变量不能访问,或是取值错误码的情况。对付这种情况时,需要在编译程序时关闭编译优化。GCC,你可以使用“-gstabs” 选项来解决这个问题。
3. 察看数组
(1)动态数组:
p *array@len
array:数组的首地址,len:数据的长度
eg:
(gdb) p *array@len
$1 = {2, 4, 6, 8, 10}
(2)静态数组
可以直接用print数组名,就可以显示数组中所有数据的内容了。
4. 输出格式
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
eg:
(gdb) p i
$21 = 101
(gdb) p/a i
$22 = 0x65
(gdb) p/c i
$23 = 101 'e'
5. 察看内存
使用examine(简写x)来查看内存地址中的值。语法:
x/
n、f、u是可选的参数。
(1)n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
(2)f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
(3)u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
eg:
x/3uh 0x54320 :从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。
6. 察看寄存器
(1)要查看寄存器的值,很简单,可以使用如下命令:
info registers
(2)查看寄存器的情况。(除了浮点寄存器)
info all-registers
(3)查看所有寄存器的情况。(包括浮点寄存器)
info registers
(4)查看所指定的寄存器的情况。
寄存器中放置了程序运行时的数据,比如程序当前运行的指令地址(ip),程序的当前堆栈地址(sp)等等。你同样可以使用print命令来访问寄存器的情况,只需要在寄存器名字前加一个$符号就可以了。如:p $eip。
7. display自动显示的变量
(1)格式:display[/i|s] [expression | addr]
eg:
display/i $pc
$pc是GDB的环境变量,表示着指令的地址,/i则表示输出格式为机器指令码,也就是汇编。于是当程序停下后,就会出现源代码和机器指令码相对应的情形,这是一个很有意思的功能。
(2)其他
undisplay
delete display
删除自动显示,dnums意为所设置好了的自动显式的编号。如果要同时删除几个,编号可以用空格分隔,如果要删除一个范围内的编号,可以用减号表示(如:2-5)
disable display
enable display
disable和enalbe不删除自动显示的设置,而只是让其失效和恢复。
info display
查看display设置的自动显示的信息。GDB会打出一张表格,向你报告当然调试中设置了多少个自动显示设置,其中包括,设置的编号,表达式,是否enable。
8. 设置
(1)set print address
set print address on
打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。
(2)set print array
set print array on
打开数组显示,打开后当数组显示时,每个元素占一行,如果不打开的话,每个元素则以逗号分隔。
(3)set print elements
这个选项主要是设置数组的,如果你的数组太大了,那么就可以指定一个来指定数据显示的最大长度,当到达这个长度时,GDB就不再往下显示了。如果设置为0,则表示不限制。
(4)set print null-stop
如果打开了这个选项,那么当显示字符串时,遇到结束符则停止显示。这个选项默认为off。
(5)set print pretty on
如果打开printf pretty这个选项,那么当GDB显示结构体时会比较漂亮。如:
$1 = {
next = 0x0,
flags = {
sweet = 1,
sour = 1
},
meat = 0x54 "Pork"
}
(6)set print union
设置显示结构体时,是否显式其内的联合体数据。
(7)set print object
在C++中,如果一个对象指针指向其派生类,如果打开这个选项,GDB会自动按照虚方法调用的规则显示输出,如果关闭这个选项的话,GDB就不管虚函数表了。