是否有一个命令gdb
,我可以用来(重新)加载/"刷新"源文件?(据我所知,gdb
只能使用源目录,根据使用GDB调试:源代码 - 并且没有特定的命令来"刷新")
我使用带有调试内核的虚拟机,因此我可以连接到本地实例gdb
,并可以调试内核模块.这些模块使用调试信息进行编译,这指定了保存模块源的文件夹(指示GDB 6.5使用嵌入在目标文件中的源 - Stack Overflow).我在VM和本地计算机的相同路径中都有源目录.
问题是这个 - 我需要做很多步骤才能使模块进入段错误 - 并且远程gdb进入堆栈.然后我做了一个回溯,我可以看到引用的源文件,即
#0 0xc0132a13 in ?? ()
#1 0xc056e551 in ?? ()
#2 0xc056e506 in ?? ()
#3 0xd8be53f3 in mymodule_func1 (var1=0xd79f9b44, var2=0x0, var3=825269148)
at /media/src/mymodule.h:954
#4 0xd8be53d0 in mymodule_func2 (data=3617561412)
at /media/src/mymodule.h:936
#5 0xc014fe87 in ?? ()
#6 0xc0151478 in ?? ()
Run Code Online (Sandbox Code Playgroud)
然后我试着说,list /media/src/mymodule.h:954
- 我意识到我已经改变了本地版本的mymodule.h
文件!!
所以我撤消了这些变化 - 但不幸的是,GDB没有看到这些变化!而且,当然,我不想重新启动GDB - 因为这意味着我必须重新启动VM,并完成整个过程以使内核模块再次发生段错误:( …
我正在使用Ubuntu 10.04,并研究内核对象的编程.
我遇到了一些相当复杂的结构,我很难阅读,所以我想我会尝试找一些可以帮助我想象它们的工具.
到目前为止我唯一能找到的是VCG,它有一个C Struct Visualization Example,如下所示:
这看起来像我想要使用的东西.
第一件事是,为Ubuntu打包的最后一个VCG是耐用的vcg(1.30debian-6) - 但.deb包可以在没有问题的情况下下载并安装在Ubuntu Lucid中.
但是,看起来这个包只是一个VCG 查看器(类似于vcgviewer,我猜).该vcgviewer页笔记:
To generate compiler graph data with newest gcc compilers use:
gcc -g -da -dv -fdump-tree-original-raw -fdump-tree-all-all
Run Code Online (Sandbox Code Playgroud)
因此,显然我必须gcc
在编译时使用这些开关,以从C源生成.vcg图形文件.
然而,问题是我正在构建一个只引用Linux头的内核模块 - 因为我尽量避免重新编译整个内核.看来,只要我尝试-fdump-tree-...
在该上下文(内核模块)中使用开关,gcc
就想开始编译内核的其余部分!(并且在.vcg图的编译和生成中显然都失败了 - 因为我没有内核源代码,只有头文件)
所以我的问题是 - 是否有一个工具,可以生成.vcg或.dot结构图 - 只需使用纯文本头文件作为输入?(它不必解析所有依赖项 - 只是在同一目录中的头文件中)
编辑:对我来说,后端特别是.vcg或.dot对我来说实际上并不重要,我提到它们只是因为到目前为止我找到了它们; 任何类型的软件,允许类似的结构可视化,无论后端,欢迎:)
PS:请注意,如果您不想使用VCG查看器查看.vcg图表,则可以将.vcg格式转换为.dot格式,graphviz
而是使用可视化.什么工作对我来说是使用图形易- search.cpan.org的perl
-这第一次拿到打包在Ubuntu与小牛版,作为libgraph易-perl的(然而,的.deb文件可以-再-下载并安装不Lucid的问题).libgraph-easy-perl …
这是一个简短的代码段示例(您可以将其粘贴到Linux终端中),创建一个新的git
存储库并向其添加一些文件(使用git版本1.7.9.5):
cd /tmp/
mkdir myrepo_git
cd myrepo_git/
git init
git config user.name "Your Name"
git config user.email you@example.com
echo "test" > file_tracked_unchanged.txt
echo "test" > file_tracked_changed.txt
echo "test" > file_untracked.txt
git add file_tracked_unchanged.txt
git add file_tracked_changed.txt
git commit -m "initial commit"
Run Code Online (Sandbox Code Playgroud)
现在,在初始提交之后,我想要更改file_tracked_changed.txt
文件,并保持其他(此处,仅file_tracked_unchanged.txt
)在下一次提交时保持不变.下面是一个片段,演示了git status
vs git ls-files
(git
shell输出的前缀是多种输出#
):
echo "test more" >> file_tracked_changed.txt
git status -uno
# # On branch master
# # Changes not staged for commit:
# # …
Run Code Online (Sandbox Code Playgroud) 提前道歉我不能立即接受答案 - 只是想我想记下来,而我有问题......
简而言之:当我在Linux下使用用户空间C代码启动对usb-serial端口的写入时,我可以观察到三种不同的缓冲区大小 - 问题是,我想从用户空间C中检索所有这些大小代码本身.
比方说,我有一个带有FTDI FT232芯片的Arduino Duemillanove,它被编程为从PC读取来自usb /串行连接的输入字节,然后丢弃它们.当我在系统中插入此设备时(在Ubunty 11.04 Natty上执行此操作),我可以通过以下方式观察以下内容tail -f /var/log/syslog
:
Mar 21 08:05:05 mypc kernel: [ 679.197982] usbserial: USB Serial Driver core
Mar 21 08:05:05 mypc kernel: [ 679.223954] USB Serial support registered for FTDI USB Serial Device
Mar 21 08:05:05 mypc kernel: [ 679.227354] ftdi_sio 2-2:1.0: FTDI USB Serial Device converter detected
Mar 21 08:05:05 mypc kernel: [ 679.227633] usb 2-2: Detected FT232RL
Mar 21 08:05:05 mypc kernel: [ 679.227644] usb 2-2: Number …
Run Code Online (Sandbox Code Playgroud) 在下面给出的代码中,有一个简单的Linux内核模块(驱动程序),它add_timer
以1 jiffy的分辨率重复调用一个函数10次(也就是说,计时器计划发射jiffies + 1
).使用该bash
脚本rerun.sh
,然后从打印输出中获取时间戳syslog
,并使用它来显示它们gnuplot
.
在大多数情况下,我得到这样的syslog
输出:
[ 7103.055787] Init testjiffy: 0 ; HZ: 250 ; 1/HZ (ms): 4
[ 7103.056044] testjiffy_timer_function: runcount 1
[ 7103.060045] testjiffy_timer_function: runcount 2
[ 7103.064052] testjiffy_timer_function: runcount 3
[ 7103.068050] testjiffy_timer_function: runcount 4
[ 7103.072053] testjiffy_timer_function: runcount 5
[ 7103.076036] testjiffy_timer_function: runcount 6
[ 7103.080044] testjiffy_timer_function: runcount 7
[ 7103.084044] testjiffy_timer_function: runcount 8
[ 7103.088060] testjiffy_timer_function: runcount 9
[ 7103.092059] testjiffy_timer_function: runcount …
Run Code Online (Sandbox Code Playgroud) 我正在使用Firefox 5,我已经知道扩展名位于Profile文件夹的extensions
子文件夹中 ...但是,我需要找到特定扩展名(例如,CoLT)的位置; 问题是大多数扩展文件夹都是由guid命名的,例如
extensions$ ls
{232ac1d3-4d70-4919-8338-48c3d3f98afc}
{29c4afe1-db19-4298-8785-fcc94d1d6c1d}
{2bfc8624-5b8a-4060-b86a-e78ccbc38509}
{33f141c0-3703-4a4c-b459-cec618a7dafd}
...
Run Code Online (Sandbox Code Playgroud)
然后再说:" 从Gecko 2.0(Firefox 4/Thunderbird 3.3/SeaMonkey 2.1)开始,安装扩展时不再解压缩XPI文件.而是将XPI本身放在扩展目录中,文件直接加载到包. "(扩展包装 - MDN文档)......
由于XPI基本上是一个ZIP存档,因此请浏览extensions
文件夹,查找扩展名:
extensions$ grep -ri 'colt' .
Run Code Online (Sandbox Code Playgroud)
......什么都不会回报
那么,有没有人知道一个方法(或扩展名)告诉我究竟哪个XPI(或解压缩文件夹)是位于/加载的特定扩展名?
请考虑以下Python代码段:
for ix in [0.02, 0.2, 2, 20, 200, 2000]:
iss=str(ix) + "e9"
isf=float(iss)
print(iss + "\t=> " + ("%04.03e" % isf ) + " (" + str(isf) + ")")
Run Code Online (Sandbox Code Playgroud)
它生成以下输出:
0.02e9 => 2.000e+07 (20000000.0)
0.2e9 => 2.000e+08 (200000000.0)
2e9 => 2.000e+09 (2000000000.0)
20e9 => 2.000e+10 (20000000000.0)
200e9 => 2.000e+11 (2e+11)
2000e9 => 2.000e+12 (2e+12)
Run Code Online (Sandbox Code Playgroud)
我的问题是 - 是否有可能以某种方式"回去"?那是:
2.000e+07 => 0.02e9
2.000e+08 => 0.2e9
2.000e+09 => 2e9
2.000e+10 => 20e9
2.000e+11 => 200e9
2.000e+12 => 2000e9
Run Code Online (Sandbox Code Playgroud)
......我指定我希望指数为" e+09
"; …
在Linux中,有一个文件,/sys/kernel/debug/tracing/trace_pipe
顾名思义,它是一个管道.所以,假设我想用Python读取它的前50个字节 - 我运行以下代码:
$sudo python -c 'f=open("/sys/kernel/debug/tracing/trace_pipe","r"); print f; print f.read(50); f.close()<br>
<open file '/sys/kernel/debug/tracing/trace_pipe', mode 'r' at 0xb7757e90>
Run Code Online (Sandbox Code Playgroud)
我们可以看到打开文件的速度很快(如果我们拥有超级用户权限) - 但是,如果该trace_pipe
文件在那时是空的,它将只是阻塞(即使有内容,内容也将被转储,直到没有更多,然后再次文件将阻止).然后我必须按Ctrl- C用KeyboardInterrupt
... 中断Python脚本
如何让Python 2.7执行超时读取?
也就是说,我想指示Python "尝试从这个文件中读取50个字节;如果你在一秒钟后没有成功,就放弃并返回"?
我正在构建一个内核模块中的一些结构略有问题,所以我认为如果有一种简单的方法来打印结构及其值,那将是很好的 - 以下是一个很小的用户态的例子我的意思.
假设我们有如下的简单C示例(以bash命令的形式给出):
FN=mtest
cat > $FN.c <<EOF
#include <stdio.h> //printf
#include <stdlib.h> //calloc
struct person
{
int age;
int height;
};
static struct person *johndoe;
main ()
{
johndoe = (struct person *)calloc(1, sizeof(struct person));
johndoe->age = 6;
asm("int3"); //breakpoint for gdb
printf("Hello World - age: %d\n", johndoe->age);
free(johndoe);
}
EOF
gcc -g -O0 $FN.c -o $FN
# just a run command for gdb
cat > ./gdbcmds <<EOF
run
EOF
gdb --command=./gdbcmds ./$FN
Run Code Online (Sandbox Code Playgroud)
如果我们运行这个例子,程序将编译,gdb将运行它,并自动停在断点处.在这里我们可以做到以下几点:
Program received signal …
Run Code Online (Sandbox Code Playgroud) Python中存在一个已知问题,当stdout上发生"Broken pipe"时,"文件对象析构函数中的关闭失败" - Python跟踪器问题11380 ; 在python中也可以看到- 为什么我的Python3脚本无法将其输出连接到head或tail(sys模块)?- Stack Overflow.
我想要做的是,在Python 2.7和Python 3+中打印出同样的自定义消息.所以我准备了一个测试脚本testprint.py
并运行它(显示在bash
Ubuntu 11.04 中完成的片段):
$ cat > testprint.py <<"EOF"
import sys
def main():
teststr = "Hello " * 5
sys.stdout.write(teststr + "\n")
if __name__ == "__main__":
main()
EOF
$ python2.7 testprint.py
Hello Hello Hello Hello Hello
$ python2.7 testprint.py | echo
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr
$ python3.2 testprint.py | echo
Exception IOError: (32, …
Run Code Online (Sandbox Code Playgroud)