小编Abs*_*ion的帖子

附加MSVC 2012探查器会挂起应用程序

我有一个C++应用程序(它是使用Qt 5.8库构建的,并且PostgreSQL 9.5在与数据库相关的情况下使用它).该应用程序由MSVC 2012编译器构建,是64位应用程序,调试和发布版本都可以自行运行并在cdb调试器下运行.

当我尝试通过Visual Studio仪器(Analyze - > Profiler - > Attach)分析正在运行的应用程序时,它一旦尝试做一些有意义的事情就会立即挂起:只需调整窗口大小或单击复选框就可以了,但任何计算新值的尝试都是如此并将它们写入数据库永远不会成功,就像控制流没有从某个调用返回一样.

当我停止分析时,Studio标记为"热路径"调用序列RtlWalkFrameChain- > RtlpWalkFrameChain- > RtlpLookupFunctionEntryForStackWalks- > RtlLookupFunctionTable- > RtlAcquireSRWLockShared.
RtlpWalkFrameChain拥有最大的"独家样品"数量.
尝试过滤数据以排除最初的几秒运行(直到明显冻结)导致"无呼叫树数据可用"消息.

我没有设法找到任何类似问题的文章或帖子.
该项目是在Qt Creator中构建的(我没有Studio可以理解的项目文件,因此我无法运行"正常"性能分析).
OS是Windows 7,确切的版本Visual Studio是11.0.61219.00更新5.
欢迎任何关于这个主题的想法.

更新:当我尝试使用Luke Stackwalker探查器分析应用程序时,它会中止消息ERROR: StackWalk64-Endless-Callstack!.关于我发现的消息的唯一相关评论是Stackoverflow问题.当我在cdb调试器下运行应用程序然后尝试使用Luke Stackwalker对其进行配置时,错误消息是相同的,但调试器中的后续暂停显示所有线程的正确(或至少可信)堆栈.对于工作线程调试器指向系统库中的一行代码,并且无论我做什么都不会前进(再一次,没有分析尝试,应用程序正常运行,调试器与否).

profiler visual-studio-2012

8
推荐指数
0
解决办法
156
查看次数

C++ - 有没有办法获得具有不变语法的当前类类型?

我想编写一个宏,当在类中扩展时,使用该类类型(特别是作为模板参数).在类方法中,我可以使用这个:

#define METHOD_MACRO int sample_method(void)const {\
    return template_struct<this_type<decltype(this)>::type>::index;}
Run Code Online (Sandbox Code Playgroud)

(this_type是我的结构,在这里相当于remove_pointer<remove_const<T>>)

但是当我需要方法之外的类类型(对于类成员指针的typedef)时,this关键字不可用; 我试图用auto一些技巧来推断类型,但这里没有运气.有问题的类是从我的班级继承的,如果这可以有任何帮助.我想避免使用我的宏必须写强制性的任何人typdedef.

有任何想法吗?

c++ templates c++11

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

使用不完整类型,引用vs指针无效

下面的代码在Visual Studio和g ++中编译和工作:

class A;
A* getRef(void);
char (&func(...))[2];

int main() {
    bool isDefault = sizeof(func(getRef()))==2;
    std::cout << isDefault << std::endl; //prints 1
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

下一代码仍然在Studio中编译(并且可以工作),但g ++声明这是invalid use of incomplete type 'class A':

class A;
A& getRef(void); //the only change
char (&func(...))[2];

int main() {

    bool isDefault = sizeof(func(getRef()))==2; //g++ error here
    std::cout << isDefault << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是一个根本错误的代码,应该被编译器拒绝(如果是这样,为什么VS编译器不会产生任何警告)?或者在这个上下文中指针和引用之间是否存在一些我不知道的区别?

c++ g++

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

“控制到达非 void 函数末尾” with do { return result; while(条件);

我有以下功能(简化示例):

QByteArray DecompressBytes(const QByteArray& content){
  /* function body (with other return expressions) */

  do { return content; } while(content.size() != 0);
}
Run Code Online (Sandbox Code Playgroud)

添加最后一行用于测试,替换使用的宏。Visual Studio 没有发现此代码有问题,但 g++ 生成

警告:控制到达非 void 函数的末尾 [-Wreturn-type]

更改最后一行以return content;删除警告。
我的问题:为什么编译器会这样做?代码的形式应该是什么以避免任何警告?

最后一行过去是扩展为ASSERT_FAIL("must be unreachable", content)模式,并用另一个宏替换以禁止非布尔表达式,因此生成的表达式类似于. ASSERT_FAILdo { ... } while(false)whiledo { qt_assert_x("", "", 42); return content; } while(::helper::bool_verify(false));

g++ 版本 5.3.0,与 MinGW(标准 Qt 设置)一起使用。

更新:在尝试注释代码的不同部分之后(因为上面的纯示例不允许重现问题),出现了一些非常奇怪的情况:

QByteArray DecompressBytes(const QByteArray& content){
  QByteArray decompressed; //no 'unused variable' warning
  do { return content; …
Run Code Online (Sandbox Code Playgroud)

c++ gcc gcc-warning

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

使用FFMpeg库读取RTSP流 - 如何使用avcodec_open2?

在尝试阅读rtsp流时,我遇到了一些问题,包括代码和文档.简短说明:无论我做什么,avcodec_open2要么失败(说"编解码器类型或ID不匹配"),或者widthheight调用后编解码方面都是0(从而进一步代码没用).流本身可以通过VLC播放器正常打开并av_dump_format()显示正确的信息.我的代码基于这个问题的技术答案.

详细说明:我的代码是在C#中,但这里是C++ - 相当于FFMpeg调用(实际上我将代码减少到这个最小值并且问题仍然存在):

av_register_all();
avformat_network_init(); //return code ignored

AVFormatContext* formatContext = avformat_alloc_context();
if (avformat_open_input(&formatContext, stream_path, null, null) != 0) {
    return;
}

if (avformat_find_stream_info(formatContext, null) < 0) {
    return;
}

int videoStreamIndex = 0;
for (int i = 0; i < formatContext->nb_streams; ++i) {
    AVStream* s = formatContext->streams[i];
    if (s->codec == null) continue;
    AVCodecContext c = *(s->codec);
    if (c.codec_type == AVMEDIA_TYPE_VIDEO) videoStreamIndex = i;
}

//start reading packets …
Run Code Online (Sandbox Code Playgroud)

ffmpeg rtsp

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

标签 统计

c++ ×3

c++11 ×1

ffmpeg ×1

g++ ×1

gcc ×1

gcc-warning ×1

profiler ×1

rtsp ×1

templates ×1

visual-studio-2012 ×1