小编Fre*_*abe的帖子

如何在git存储库中重写提交者名称?

我使用git svn将Subversion存储库转换为Git,但遗憾的是现在只注意到一些作者信息是错误的.转换后的存储库尚未与任何人共享,因此我想重写其中的提交日志 - 如果可能的话.

如何重写git存储库,以便所有提交的日志显示,例如

Author: John Doe <john.doe@example.com>
Run Code Online (Sandbox Code Playgroud)

代替

Author: John Do <john.do@example.com>
Run Code Online (Sandbox Code Playgroud)

我自己尝试这样做,似乎git-filter-branch是我需要的.不过,我无法做到这一点.

git

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

你怎么避免人们忘记运行'git push'?

在评估将基于Subversion的存储库迁移到Git的优缺点时,出现了一个有趣的问题.

尽管我们都非常喜欢Git,但有些开发人员(或开发人员团队)可能会忘记将功能/错误修复推送到构建软件包的存储库中.

我确信已经在其他软件开发团队中引起了这种担忧,我想知道你是如何解决这个问题的.

git

7
推荐指数
2
解决办法
1202
查看次数

为什么在推导类型时剥离模板参数的限定符?

在使用Microsoft VisualStudio 2008构建一个小示例程序时,我注意到对传递给模板的类型的推断有些奇怪.考虑这个例子:

template<class T>
void f( T v ) {
    x; // trigger a compile error
    (void)v;
}

template<class T>
void g( T v ) {
    f( v );
}

void h() {
  int i;
  g<const int &>( i );
}
Run Code Online (Sandbox Code Playgroud)

使用编译此示例会cl /c foo.cpp产生编译错误(按预期).有趣的是'T'模板参数的值.这是VisualStudio 2008打印的内容:

mini.cpp(3) : error C2065: 'x' : undeclared identifier
        mini.cpp(9) : see reference to function template instantiation 'void f<int>(T)' being compiled
        with
        [
            T=int
        ]
        mini.cpp(14) : see reference to function template instantiation …
Run Code Online (Sandbox Code Playgroud)

c++ templates visual-studio-2008 visual-studio

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

如何获取当前进程的作业对象(如果有)?

在Windows 作业对象的上下文中,如何获取当前进程的作业对象(如果它在作业对象中)?该IsProcessInJob功能让我测试一个给定的过程(如当前的)是否是在给定的(或有)的工作-但它不会产生匹配作业的句柄.

c c++ windows winapi process

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

如何有效地将SQlite数据库修剪到给定的文件大小?

我在Windows上使用SQLite 3.7.2.我的数据库用于存储每周7天每天24小时生成的日志数据.架构基本上是:

CREATE TABLE log_message(id INTEGER PRIMARY KEY AUTOINCREMENT, process_id INTEGER, text TEXT);
CREATE TABLE process(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT);
Run Code Online (Sandbox Code Playgroud)

log_message.process_id字段映射到process.id,从而将每个日志消息与其源自的进程相关联.

现在,数据库迟早会变得太大,我想删除最旧的条目(具有最低log_message.id值的条目),直到数据库再次降到给定大小(例如,1GB).为此,我正在做

PRAGMA page_count;
PRAGMA page_size;
Run Code Online (Sandbox Code Playgroud)

在每几条日志消息之后获取数据库的大小.如果超过我的限制,我只删除一小部分(现在:100条消息)的日志消息,如下所示:

BEGIN TRANSACTION;
DELETE FROM log_message WHERE id IN (SELECT id FROM log_message LIMIT 100);
DELETE FROM process WHERE id IN (SELECT id FROM PROCESS EXCEPT SELECT process_id FROM log_message);
COMMIT;
VACUUM;
Run Code Online (Sandbox Code Playgroud)

后一个DELETE语句从process表中删除所有未引用的条目.我重复这个过程,直到文件大小再次被接受.

这至少有两个问题:

  1. 删除100条日志消息的方法非常随机; 我根据一些实验得出了这个数字.我想知道我必须提前删除的条目数量.
  2. 重复的VACUUM调用可能需要相当长的时间(SQLite主页上说,在Linux上,每个MB的VACUUM可能需要多达半秒,我想在Windows上它不会更快).

有没有人对如何做到这一点有其他建议?

sql windows sqlite

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

如何可靠地检查一个Windows进程是否是C++中另一个进程的父进程?

我正在开发一个函数,它可以获取给定PID的父进程的PID.该功能的原型是

DWORD getParentPid( DWORD pid );
Run Code Online (Sandbox Code Playgroud)

为此,我正在使用CreateToolhelp32Snapshot函数(和相关函数)来获取PROCESSENTRY32给定PID 的结构pid.然后我可以使用th32ParentProcessId结构的字段来获取创建我给定进程的进程的PID.

但是,由于父进程可能已经被破坏(并且它的PID可能已被Windows重用),我正在使用该GetProcessTimes函数来获取假定的父进程和子进程的创建时间,然后比较那些使用的进程CompareFileTime.

如果CompareFileTime返回-1,我知道具有父ID的进程是在我的子进程之前创建的,所以它确实是父进程.否则,它显然是一个重用的ID - 并且父PID无效(它不再引用原始父级).

这个问题是它非常依赖于严格单调的系统时钟和粒度GetProcessTimes.即使正在考虑的过程确实处于亲子关系中,我确实遇到了CompareFileTime返回0(即"平等时间")的案例.我可以更改我的检查,以便将CompareFileTime结果值<= 0视为表示父项,但是我会打破(理论上)父项创建子进程,然后父进程被销毁,然后Windows重新使用PID的情况- 全部在100ns(这是分辨率GetProcessTimes).

我想知道 - 是否有一种不同的,更可靠的机制来验证某些进程确实是C++中另一个进程的父进程?

编辑:我需要这个函数来确定所有子进程(这意味着包括祖子进程).该CreateToolhelp32Snapshot让我遍历所有进程,但我需要看每个人的父PID告诉它是否是我手头过程的孩子.

c++ windows winapi

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

Spy ++ for PowerBuilder应用程序

我正在尝试编写一个工具,让我检查基于PowerBuilder的应用程序的状态.我正在考虑的是像Spy ++(或者更好的,"Snoop",因为它存在于.NET应用程序中),它允许我检查一些基于PowerBuilder的GUI的对象树(和对象的属性).

我对普通(基于MFC)的应用程序以及.NET应用程序已经做了同样的事情,但不幸的是我自己从未在PowerBuilder中开发过应用程序,所以我现在通常会考虑两个问题:

  1. 是否有一些API(最好是Java或C/C++)可以让人们遍历PowerBuilder应用程序的可视对象树?我在PowerBuilder Native Interface系统上读了一下,但似乎这是用C/C++编写PowerBuilder扩展,然后可以用PowerBuilder脚本语言调用,对吧?

  2. 如果有一些可用的API - 也许PowerBuilder应用程序甚至会暴露某种支持IPC的API,它允许我检查PowerBuilder对象层次结构的状态而不在PowerBuilder应用程序的进程中?也许有可用的自动化界面,或基于COM的东西 - 或者其他东西?

现在,我的印象是可能需要将一个DLL注入到PowerBuilder应用程序的进程中,然后获得对正在运行的PowerBuilder VM的访问权限,以便我可以查询它以获取对象树.然后,某种IPC机制将允许我将此信息传输出PowerBuilder应用程序的进程.

有没有人有这方面的经验,或者可以说明是否有人试图这样做?

最好的祝福,

  • Frerich

powerbuilder introspection code-injection spy++

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

正确捕获LoadLibrary()错误

我正在研究一种在Windows XP和Windows Vista之间的所有Windows版本上运行的C++软件.在我的代码中,我开发了一个链接标准库(Qt库)的DLL .一旦部署了我的软件,用户在他的系统上没有完全相同的Qt构建,但配置略有不同并不罕见.可能存在禁用的功能(因此它们的Qt构建不会导出相同的符号集),或者甚至可能以使库二进制文件与原始文件不兼容的方式更改库.

在某些时候,我通过LoadLibrary()调用加载我的DLL.这可以吸引用户系统上的任何Qt库.如果我很幸运,他们的Qt构建与我在开发DLL时使用的内容兼容,因此LoadLibrary()成功.但是,根据他们对Qt构建所做的更改,LoadLibrary()调用有时会失败

  • "指定的模块无法找到."; 如果他们的Qt构建包含比我的Qt构建更少的DLL,通常会发生这种情况.所以我的DLL试图加载例如QtFoo.dll但由于这个dll不是他们的Qt构建的一部分,加载我的DLL失败.
  • "无法找到指定的程序."; 如果他们更改了他们的Qt构建以便禁用某些功能,这通常会发生这种情况,这会导致导出的符号减少.

我的问题是:我怎样才能优雅地捕捉到这些错误?对,我只是使用GetLastError(),然后打印上述两个消息之一.然而,这将是多少,如果我知道更多有用的模块无法找到,或者缺少的程序.我注意到,当在资源管理器中运行一个链接缺少DLL的应用程序时,资源管理器设法产生一个很好的'由于缺少所需的库blah.dll而无法加载应用程序foo'.是否有一些API可用于获取有关LoadLibrary()调用失败原因的更多信息?

c++ windows plugins qt loadlibrary

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

是否有可以连接到现有应用程序的手柄泄漏检测器?

我参与了各种C++项目(主要是使用MSVC6到MSVC10),我们最近发现了一些句柄泄漏(CreateThread函数给出的线程句柄).我怀疑还有很多其他手柄被泄漏了,我想整合一个测试,验证我们的夜间测试结果没有泄漏手柄.

我的想法是开发一个DLL来检测相关的kernel32.dll函数(CreateThread,OpenProcess,CreateProcess和其他十几个)以及CloseHandle函数.然后,对于每个获取的句柄,DLL将记忆回溯.在该过程结束时,DLL将打印所有未关闭到某种日志文件的句柄回溯,然后可以由测试框架解析.

这当然也会产生所有仍然可以到达的句柄的回溯(所以从技术上讲,它们没有泄漏 - 也许作者希望操作系统在进程终止时回收它们)但我猜是明确地关闭它们并没有伤害 - 特别是因为我们已经为这些东西提供了一些不错的RAII包装器,所以我们不应该尽可能多地使用它.

现在我想知道 - 这似乎是一种相当简单的方法; 也许这里有人知道已经这样做的图书馆?

c++ winapi memory-leaks

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

是否从"this"中抛弃constness然后更改成员值会调用未定义的行为?

在回答我对另一个问题中某些答案的评论时,有人建议像

void C::f() const
{
  const_cast<C *>( this )->m_x = 1;
}
Run Code Online (Sandbox Code Playgroud)

因为修改了const对象,所以会调用未定义的行为.这是真的?如果不是,请引用C++标准(请提及您引用的标准),这样可以实现此目的.

对于它的价值,我总是使用这种方法来避免制作成员变量,mutable如果只需要一两个方法就可以写入它(因为使用mutable它可以写入所有方法).

c++ const standards-compliance const-cast

6
推荐指数
2
解决办法
310
查看次数