小编use*_*631的帖子

如何访问.gdbinit和gdb内部的环境变量?

我想在使用gdb进行调试时设置源代码的路径.我选择使用.gdbinit文件.

基本上,它包含一个命令:

directory="/path/to/src".
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够将该命令指定为:

directory="$SOURCESROOT/src"
Run Code Online (Sandbox Code Playgroud)

哪里SOURCESROOT是环境变量.并且,如果可能的话,也可以通过输入在gdb debuuging会话中做到这一点directory=$SOURCESROOT/folder.

基本上,我希望访问gdb(或.gdbinit内部)环境变量.

但不是debugee的环境(设置env等),而是gdb本身的环境(即我首先键入的bash提示符"gdb program").

虽然shell $SOURCESROOT在gdb会话中键入内容会显示环境变量的内容,但这是无用的,因为我无法输入:directory=shell $SOURCESROOT.

PS:任何人都找到了一个理想的设置Linux(Debian)下载带有"apt-get source"的源代码,用某种"apt-get update"utopic命令更新那些并安装它们以便gdb自动找到这些来源?

linux debugging gdb

16
推荐指数
2
解决办法
5502
查看次数

我是否被迫使用pthread_cond_broadcast(超过pthread_cond_signal)以保证*my*thread被唤醒?

在一些QT GUI线程(一个pthread线程)与一些C代码连接的上下文中,我偶然发现了以下问题:我启动了QT Gui线程,在我的C线程恢复其路径之前,我需要确保所有的QT Gui线程中的图形对象已经被构造出来并且它们是有效的QObject(因为C代码将调用QObject:connect()它们).

引言旁边,等待是通过一个pthread_cond_wait()+一个条件变量+一个C线程中的一个相关互斥:

int isReady=0;
pthread_mutex_lock(&conditionReady_mutex);
while(isReady==0) {
    pthread_cond_wait(&conditionReady_cv, &conditionReady_mutex);
}
pthread_mutex_unlock(&conditionReady_mutex);
Run Code Online (Sandbox Code Playgroud)

另一方面,QT Gui线程构造其图形对象,然后用以下信号发出信号:

pthread_mutex_lock(&conditionReady_mutex);
isReady=1;
pthread_cond_broadcast(&conditionReady_cv);
pthread_mutex_unlock(&conditionReady_mutex);
Run Code Online (Sandbox Code Playgroud)

基本的东西,如你所见.但问题是:在Qt Gui线程中,我一直在使用pthread_cond_broadcast(),以确保我的C线程被唤醒,当然.是的,在我当前的应用程序中,我只有一个C线程和一个Qt Gui线程,并且pthread_cond_signal()应该完成唤醒C线程的工作(因为它保证唤醒至少一个线程,并且C线程是唯一的一).

但是,在更一般的上下文中,假设我有三个C线程,但我希望它们中的一个(或两个)被唤醒.一个(两个)特定线程.我该如何确保?

如果我使用pthread_cond_signal(),那可能只是唤醒第三个线程,这将完全忽略这一点,因为我感兴趣的一个线程没有被唤醒.OTOH,唤醒所有线程,甚至那些不需要的线程,这些都是pthread_cond_broadcast()过度的.

有一种方法可以告诉pthread_cond_signal()哪个线程被唤醒?

或者,我是否应该引入更多的条件变量,以便在唤醒的线程组中获得更精细的粒度pthread_cond_broadcast()

谢谢.

c qt pthreads

9
推荐指数
1
解决办法
1973
查看次数

kernel的panic()函数是否完全冻结了其他所有进程?

我想确认的是内核的panic()功能和其他人一样kernel_halt()machine_halt(),一旦被触发,保证机器的完全冻结.

那么,所有内核和用户进程都被冻结了吗?panic()调度程序是否可以中断?中断处理程序仍然可以执行?

使用案例:如果出现严重错误,我需要确保硬件看门狗重置机器.为此,我需要确保没有其他线程/进程使看门狗保持活跃状态​​.我需要触发完全停止系统.目前,在我的内核模块中,我只是调用panic()冻结所有内容.

另外,用户空间halt命令可以保证冻结系统吗?

谢谢.

编辑:根据:http://linux.die.net/man/2/reboot,我认为最好的方法是使用reboot(LINUX_REBOOT_CMD_HALT):"控制权给予ROM监视器,如果有的话"

linux kernel panic

8
推荐指数
1
解决办法
5947
查看次数

Linux reboot()系统调用:为什么在kernel_halt()之后调用do_exit(0)?

这与以下内容有关:https://stackoverflow.com/a/13413099/1284631

现在,问题是:

为什么使用LINUX_REBOOT_CMD_HALT参数调用reboot()系统调用(参见此处:http://lxr.linux.no/linux+v3.6.6/kernel/sys.c#L480)在调用do_exit(0)之后调用kernel_halt(),如调用kernel_halt()boils向下调用stop_this_cpu()(在这里看到:http://lxr.linux.no/linux+v3.6.6/arch/x86/kernel/process.c#L519),为的一部分native_machine_halt()(在这里看到:HTTP://lxr.linux .no/linux + v3.6.6/arch/x86/kernel/reboot.c#L680).

或者,在我看来,它stop_this_cpu()永远不会返回(它以无限循环结束).

所以,它被do_exit(0)调用以防万一kernel_halt()它不能完成它的工作并返回?那么为什么不panic()直接呢?

linux kernel reboot halt system-calls

5
推荐指数
1
解决办法
1920
查看次数

linux设备驱动程序文件操作:是否可能有竞争条件?

考虑一个实现open(),read(),write(),close(),unlocked_ioctl()和mmap()的linux设备驱动程序。

现在,假设有多个(或相同)进程同时打开同一设备(/ dev /设备)。

是否以任何方式保证这些文件操作相互之间是原子的,还是应该每个open(),read(),write(),close()都使用互斥体,以使它们中的一对不会抢占它们例如在更改中间(通过相同的inode)缓冲区数据?

如果内核保证彼此之间的原子性,并且每个操作找到并保持缓冲区/硬件处于一致状态,则没有必要。

请把我重定向到一些参考(如果您知道)。

谢谢。

编辑:这是在评论之一,但我发现的最佳参考是在这里:

http://www.makelinux.net/ldd3/chp-6-sect-6

它还显示了缓解问题的策略,方法是通过限制单个用户,或者通过创建副本,或者通过迫使用户等待等方式。

linux file-io kernel race-condition

5
推荐指数
1
解决办法
2262
查看次数

为什么这个奇怪的定义为PTHREAD_CREATE_JOINABLE,PTHREAD_CREATE_DETACHED

pthread.h,可以找到以下定义:

/* Detach state.  */
enum
{
  PTHREAD_CREATE_JOINABLE,
#define PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_JOINABLE
  PTHREAD_CREATE_DETACHED
#define PTHREAD_CREATE_DETACHED PTHREAD_CREATE_DETACHED
};
Run Code Online (Sandbox Code Playgroud)

为什么这个定义混合枚举和定义?怎么解释呢?此外,它#define正在定义相同的东西.

c

4
推荐指数
1
解决办法
420
查看次数

不能在C++中激发优先级倒置

我试图在一个小的C++程序上激发优先级倒置以进行演示,但我不能:持有互斥锁的低优先级线程没有被抢占并继续在关键部分运行.这就是我正在做的事情:

// let's declare a global mutex
pthread_mutex_t my_mutex;
  ...

int main(int argc, char **argv) {
  ...
  pthread_t normal_thread;
  pthread_t prio_thread;

  pthread_mutexattr_t attr;
  pthread_mutexattr_init (&attr);
  pthread_mutexattr_setprotocol (&attr, PTHREAD_PRIO_NONE);  // ! None !
  pthread_mutex_init(&my_mutex, &attr);

  // create first normal thread (L):
  pthread_create(&normal_thread, NULL, the_locking_start_routine, NULL);

  // just to help the normal thread enter in the critical section
  sleep(2);

  // now will launch:
  // * (M) several CPU intensive SCHED_FIFO threads with priority < 99
  // …
Run Code Online (Sandbox Code Playgroud)

c++ mutex pthreads real-time thread-priority

3
推荐指数
1
解决办法
3096
查看次数

此 bash 代码如何检测交互式会话?

在 scp 出现一些问题之后(显然,它不喜欢我的文件中存在 bash 绑定命令.bashrc),我遵循了互联网上一个聪明人的建议(我现在找不到那个帖子),该建议放在顶部其.bashrc文件如下:

[[ ${-#*i} != ${-} ]] || return
Run Code Online (Sandbox Code Playgroud)

以确保除非在交互式会话中否则不会执行 bash 初始化。

现在,这有效了。但是,我无法弄清楚它是如何工作的。你能启发我吗?

根据这个答案,这$-是为 shell 设置的当前选项,我知道这${}是用于扩展变量的所谓“子字符串”语法。

但是,我不明白这${-#*i}部分。又为什么$-#*i不一样${-#*i}

bash shell

1
推荐指数
1
解决办法
624
查看次数